`
吖龙Sam
  • 浏览: 20883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中的Socket编程(2)-提高

    博客分类:
  • Java
阅读更多

日日行,不怕千万里;常常做,不怕千万事。
意思是说,每天都走路的话,就不怕走千里万里,每天都做事的话,就不怕做了千事万事。学习也一样,每天学一点,就不怕学习了千万知识。

上一次我们对Socket编程有了一个初步的了解,今天我们来继续学习。上一次我们写了一个简单的服务端和客户端程序,只是实现了客户端写,服务端读。今天我们来实现一个服务端和客户端同时读写的程序。

需求:实现一个服务端和客户端同时读写。

为了便于大家更好的理解,我画了一个程序流程图,虽然不是很专业和美观,但旨在说明问题。

1、程序流程图:



2、代码实现:

1)服务端代码:

/**
 * 服务端
 * 需求:服务端和客户端同时读写
 * @author Sam
 *
 */
public class EnhanceServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 创建一个服务端ServerSocket,监听指定端口的请求
			ServerSocket ss = new ServerSocket(9999);
			System.out.println("Server 等待客户端接入...");
			// 监听客户端请求
			Socket socket = ss.accept();
			// 与客户端建立连接之后,读取客户端发过来的信息
			InputStream is = socket.getInputStream();
			
			byte[] buffer = new byte[1024];
			int len = 0;
			// 定义一个字符串构建器,用于存储客户端发过来的数据
			StringBuilder sBuilder = new StringBuilder();
			int index;
			while ( (len=is.read(buffer)) != -1 ) {
				String temp = new String(buffer, 0, len);
				// 读到结束符,则跳出循环
				if ( (index=temp.indexOf("eof")) != -1 ) {
					// 截取指定长度
					sBuilder.append(temp.substring(0, index));
					break;
				}
				// 如果没有读到结束符,则继续读取,并加入字符串构建器
				sBuilder.append(temp);
			}
			System.out.println("Server 来自客户端的信息 : " + sBuilder.toString());
			
			// 读完之后,往客户端发送响应数据
			OutputStream out = socket.getOutputStream();
			out.write("Hello Client!".getBytes());
			out.write("eof".getBytes());// 写一个结束符
			out.flush();
			
			out.close();
			is.close();
			socket.close();
			ss.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


服务端代码分析:
1)代码流程:服务端先读取客户端发送过来的数据,然后输出在控制台中,读完之后,接着往客户端写一段回应数据。
前面我们提到服务端在监听客户端请求时,使用的accept方法是阻塞方法;
2)问题原因:在这里while循环判断条件中的read方法也是阻塞式操作的,也就是说while循环判断条件中当读到数据时,就会执行循环体,否则就一直处于阻塞状态,这样后面的代码就永远无法执行了。
3)解决方案:所以,我们通常都会约定一个结束标记,当服务端读到客户端发送过来的数据包含结束标记时,服务端就会跳出循环,接着执行往下的代码。
在这里我们约定结束标记为eof,每次写完数据都要写一个结束标记!

2)客户端代码:

/**
 * 客户端
 * @author Sam
 *
 */
public class EnhanceClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 与服务端建立连接(服务端主机号,服务端监听的端口号)
			Socket socket = new Socket("127.0.0.1", 9999);
			// 与服务端建立连接之后,就可以往服务端写数据
			OutputStream out = socket.getOutputStream();
			// 往服务端中写数据
			out.write("Hello Server!".getBytes());
			out.write("eof".getBytes());// 写一个结束符,表示写入完毕
			out.flush();
			
			// 写完之后,获取服务端的响应数据
			InputStream is = socket.getInputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			// 定义一个StringBuilder存储客户端发过来的数据
			StringBuilder sBuilder = new StringBuilder();
			int index;
			while ( (len=is.read(buffer)) != -1 ) {
				String temp = new String(buffer, 0, len);
				// 读到结束符,则跳出循环
				if ( (index=temp.indexOf("eof")) != -1) {
					sBuilder.append(temp.substring(0, index));
					break;
				}
				sBuilder.append(temp);
			}
			System.out.println("Client 来自服务端的信息 : " + sBuilder.toString());
			out.close();
			is.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


客户端代码分析:
1)代码流程:
客户端往服务端写一段数据,写完之后,接着读取服务端返回的响应数据,并输出在控制台中。
2)问题原因:
同理,客户端发送数据完毕后,往流中写一个结束标记符告诉服务端数据已经发送完毕。

3、运行结果:
注意:先运行Server程序,再运行Client程序。结果如下:
1)Server程序控制台:



2)Client程序控制台:



4、总结:
这便是服务端和客户端同时通信的程序。客户端发送数据给服务端,服务端收到数据之后再返回相应的结果给客户端。
  • 大小: 139.1 KB
  • 大小: 13.3 KB
  • 大小: 9.2 KB
分享到:
评论

相关推荐

    Java网络编程(socket---网上广播).rar_Java 网络_Socket网络编程_java socket _ja

    本教程将深入探讨Java中的Socket编程,特别是如何实现网上广播功能。网上广播允许一个设备向网络上的所有设备发送数据,无需预先知道接收者的具体地址。 首先,让我们了解什么是Socket。Socket在计算机网络中是一种...

    java-socket连接nodejs-socket

    Socket编程是一种基础的网络通信机制,允许两个应用程序通过网络交换数据。 首先,让我们深入了解一下Java中的Socket。在Java中,Socket是`java.net.Socket`类的一个实例,它代表了TCP协议中的一个连接。创建Socket...

    Java Socket学习---单线程阻塞

    在Java编程语言中,Socket是实现网络通信的基本组件。"Java Socket学习---单线程阻塞"这个主题主要探讨了如何使用Java的Socket类进行单线程的阻塞式通信,这种模式通常用于简单的客户端-服务器应用。在这个场景中,...

    Java Socket学习---多线程阻塞

    通过对`EchoServer.java`、`SocketUtils.java`和`EchoClient.java`的分析,我们可以深入理解Java Socket编程以及多线程阻塞模式在实际应用中的实现。这对于开发网络应用程序,尤其是需要处理大量并发连接的服务端...

    Java TCP-IP Socket编程-卡尔弗特.pdf

    本资料“Java TCP-IP Socket编程-卡尔弗特.pdf”旨在深入探讨如何利用Java语言进行TCP/IP套接字编程,构建稳定、高效的数据传输通道。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,而...

    华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx

    "华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx" 这份实验报告主要涵盖了计算机网络实验的两个部分:Socket 编程和网络组建实验。下面是对这两部分的详细解释和知识点总结: Socket 编程 Socket ...

    java的Socket编程

    在Java中,`java.net.Socket`和`java.net.ServerSocket`类是Socket编程的主要工具。 1. **Socket类**: - `Socket`类代表TCP连接的一端,用于建立客户端与服务器之间的连接。它的构造函数通常需要指定服务器的IP...

    总结java_socket编程.doc

    在Java中,Socket编程主要是基于TCP/IP协议的网络编程。 网络编程的两个主要问题 在网络编程中,有两个主要的问题需要解决:一是如何准确地定位网络上的一台或多台主机,二是找到主机后如何可靠高效地进行数据传输...

    Java多线程-Socket编程

    Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...

    Java TCP IP Socket编程(原书第2版).

    《Java TCP/IP Socket编程(原书第2版)》基于TCP/IP Socket相关原理,对如何在Java中进行Socket编程作了深入浅出的介绍。《Java TCP/IP Socket编程(原书第2版)》内容简明扼要,条理清晰,并在讲解相应的概念或编程...

    Java Socket网络编程.pdf

    在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...

    Java TCP IP Socket编程(原书第2版)

    《Java TCP/IP Socket编程》(原书第2版)是一本深入探讨Java中Socket编程的专著,旨在帮助读者理解并掌握如何在Java环境中利用TCP/IP协议进行网络通信。本书不仅详细介绍了Socket的工作原理,还提供了丰富的示例...

    JAVA Socket编程实现文件上传

    Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...

    三步学会Java_Socket编程

    在Java中,Socket编程是实现网络通信的基础,它提供了进程间通信的能力,使得两个相隔万里的计算机可以通过互联网进行数据交换。本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** ...

    java编程-socket-套接字-网络编程.docx

    ### Java编程中的Socket与网络编程详解 #### 一、Socket编程概述 Socket编程是Java网络编程的...以上就是关于Java中Socket编程的基本介绍及其实现细节。希望这些内容能帮助您更好地理解和掌握Socket编程的相关知识。

    Java-Socket编程

    在本文中,我们将深入探讨Java Socket编程的概念、原理以及如何使用它来实现客户端-服务器通信。 首先,我们需要了解Socket的基本概念。Socket可以看作是网络上的一个端点,它允许两个运行在不同机器上的程序通过...

    华科-计算机网络实验报告-Java Socket编程-网络组建实验.docx

    Java Socket 编程在计算机网络实验中的应用 Java Socket 编程是计算机网络实验中的一个重要组成部分,它允许开发者创建可以在网络上传输数据的应用程序。下面是关于 Java Socket 编程在计算机网络实验中的应用的...

    java socket编程

    Java Socket编程是Java平台中用于实现网络通信的核心API,它基于TCP/IP协议栈,提供了低级别的、面向连接的、可靠的字节流通信。在本文中,我们将深入探讨Java Socket编程的关键概念、工作原理以及如何创建服务端和...

    Java面试之Socket编程

    在Java面试中,对Socket编程的理解和应用能力通常是评估开发者技能的重要标准。以下是对Socket编程的详细阐述: 1. **Java Socket编程基础** - Java中的Socket是网络通信的基础,它提供了两台计算机之间低级别的...

    JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm

    JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm

Global site tag (gtag.js) - Google Analytics