`
free9277
  • 浏览: 107783 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java Socket之单线程通信

阅读更多

1、 服务器端处理流程

    接触一种技术,首先都要熟悉它的生命周期,这样才能从大局上看每个流程的细节。才有居高临下,势如劈竹的架势。加深我们对这种技术的理解。对于socket网络编程,我们现在来看看socket服务器的生命周期。   

    socket程序,一般情况下,都是服务器与客户端成双成对出现。

    服务器端socket的生命周期为:监听服务器端口,接受客户端连接,获取客户端输入、输出流,处理业务逻辑、发送响应信息,关闭客户端连接,关闭服务区监听。详情如下所示:

 

2、 客户端处理流程

    socket程序的客户端的处理流程与服务器的相似,生命周期为:创建客户端socket,获取服务器输入、输出流,处理业务逻辑、发送相应信息、关闭客户端连接。详情如下所示:

 

3、 服务端与客户端的交互

 

 

4、 实例代码

    首先是写一个Server类,这个类用来监听9999端口,并从这个端口接收消息然后输出,当收到“bye”时退出。

public class MyServer {

	public static void main(String[] args) throws IOException {
		int port = 9999;
		
		// 监听服务器端口
		ServerSocket server = new ServerSocket(port);
		System.out.println("listening on " + port);
		
		// 接受一个客户端连接
		Socket socket = server.accept();
		System.out.println("the client " + socket.getInetAddress().getHostAddress() + " has connected!");
		
		// 获取客户端的输入流
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
		// 获取客户端的输出流
                PrintWriter out = new PrintWriter(socket.getOutputStream());
		
		while (true) {
			String msg = in.readLine();
			System.out.println("---------------------------");
			System.out.println("Server received " + msg);
			
			if (msg.equals("bye")) {
				System.out.println("Server stoped!");
				out.print("Server said 88");
				out.flush();
				break;
			} else {
				// 想客户端发送信息
				System.out.println("Server said " + msg);
				out.print("Server said " + msg);
				out.flush();
			}
		}
		socket.close();
		server.close();
	}
}

 

   然后是一个Client类,这个类连接上面启动的Server类,然后接收任何用户输入,当遇到回车时发送字符串到Server上,当输入“bye”是退出。

public class MyClient {
	public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
    	Scanner reader = new Scanner(System.in);
    	
    	// 创建客户端socket
    	Socket client = new Socket("localhost", 9999);
    	
    	// 获取客户端的输出流(获取服务器端的输入流)
        PrintWriter out = new PrintWriter(client.getOutputStream()); 
        // 获取客户端的输入流(获取服务器端的输出流)
        InputStream in = client.getInputStream();
        
        while (true) {
            System.out.println("---------------------------");
            System.out.println("Input Something: ");
            String msg = reader.nextLine(); 
        	
            System.out.println("Client sended " +  msg);
            out.println(msg);  
            out.flush();  
            
            Thread.sleep(1000);
            
            byte[] buff = new byte[in.available()];  
            in.read(buff);  
            System.out.println(new String(buff, "UTF-8"));
            
            if (msg.equals("bye")) {  
            	System.out.println("Client stop!");
                break;  
            }
        }
        out.close();
        client.close();
	}

}

 

5、 结果

   首先运行MyServer类,然后MyClient类,然后在MyClient的控制台输入任意字符。

   客户端

---------------------------
Input Something: 
11
Client sended 11
Server said 11
---------------------------
Input Something: 
22
Client sended 22
Server said 22
---------------------------
Input Something: 
bye
Client sended bye
Server said 88
Client stop!

 

   服务器端

listening on 9999
the client 127.0.0.1 has connected!
---------------------------
Server received 11
Server said 11
---------------------------
Server received 22
Server said 22
---------------------------
Server received bye
Server stoped!

  

 6、 总结

   这个例子中,客户端每一次请求,服务端都会建立一次短连接。在现实环境中,这种方法是不可行的,因为服务器中每一次创建socket连接,都会消耗cpu和内存资源。很多情况下,都会使用长连接的方式来处理经常要进行数据通信的场景。

 

  • 大小: 30.1 KB
  • 大小: 23.2 KB
  • 大小: 34.5 KB
4
2
分享到:
评论
6 楼 rex0654335 2014-06-13  
我喜欢这个排版
5 楼 free9277 2014-06-13  
james_lover 写道
呵呵,关于网络通信,你的整个思路都是错的啊。
太误导初学者了。
这段代码是错误的(虽然可以运行)。
只能第一个client连接,第一个client结束后,服务端退出啦。

  

亲,请看我的标题哦,《Java Socket之单线程通信》,今天整理了《Java Socket之多线程通信》,待会发出来。而且代码逻辑就是当遇到“bye”时,服务端停止服务,怎么能说这段代码是错的呢?
4 楼 james_lover 2014-06-13  
呵呵,关于网络通信,你的整个思路都是错的啊。
太误导初学者了。
这段代码是错误的(虽然可以运行)。
只能第一个client连接,第一个client结束后,服务端退出啦。

  
3 楼 I白I 2014-06-13  
alvin198761 写道
我想知道如果两个client 访问,你的服务怎么处理,把第一个CLient从服务器Close掉吗,还是等第一个自己走了第二个再开始操作?

多个clicent就要在服务端用数组的形式存放客户端的连接了,楼主是来一个说一句话然后close掉,连接关闭,再建立连接,给初学者参考用的。
2 楼 free9277 2014-06-12  
alvin198761 写道
我想知道如果两个client 访问,你的服务怎么处理,把第一个CLient从服务器Close掉吗,还是等第一个自己走了第二个再开始操作?

要等到第一个自己走了,第二个再开始操作。这现象就是阻塞吧。不过这篇博文主要讨论的是单线程的socket编程哦,主要目的在于理解socket服务端与客户端的生命周期。
1 楼 alvin198761 2014-06-12  
我想知道如果两个client 访问,你的服务怎么处理,把第一个CLient从服务器Close掉吗,还是等第一个自己走了第二个再开始操作?

相关推荐

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

    "Java Socket学习---单线程阻塞"这个主题主要探讨了如何使用Java的Socket类进行单线程的阻塞式通信,这种模式通常用于简单的客户端-服务器应用。在这个场景中,服务器端通过一个线程处理一个客户端的请求,当请求被...

    单线程与多线程socket通信

    通过这个Java项目,我们可以学习如何使用Java原生SDK实现Socket通信,理解单线程和多线程在并发处理上的优缺点,以及如何根据实际需求选择合适的通信模型。同时,该项目还可以作为进一步研究高级网络编程、线程管理...

    java Socket 多线程

    这样避免了单线程模型中因等待某个客户端操作而导致其他客户端无法被及时响应的问题。 ### 4. 服务端实现 在服务端,通常首先创建一个ServerSocket实例,然后在一个无限循环中调用`accept()`方法监听客户端的连接。...

    Java Socket实现单线程通信的方法示例

    本示例将介绍如何使用Java Socket实现简单的单线程通信。 首先,我们来看服务器端(Server)的实现。服务器端需要监听特定的端口,等待客户端的连接请求。在Java中,`ServerSocket`类用于创建监听端口的服务器。...

    java socket 单线程实现P2P通信

    简单大循环 单线程实现通信 1. TCP连接通信 2. Server先监听,等待Client连接 3. 双方都可以发"Stop!"停止通信,但此程序Client只会停止,Server可以一直监听,即断开后,Client可以再次连接 4. 不能一对多通信,...

    java实现简单socket通信

    Java实现的简单Socket通信是网络编程中的基础技术,主要用于设备间的双向数据传输。在这个场景中,我们有两个窗口,一个作为服务器端,另一个作为客户端,它们通过TCP协议进行通信。TCP是一种面向连接的、可靠的传输...

    基于Java实现的socket即时通信系统

    在IT领域,网络通信是不可或缺的一部分,而Java作为一种强大的编程语言,提供了丰富的API来支持网络编程,特别是通过Socket实现客户端/服务器(C/S)架构的即时通信系统。本项目"基于Java实现的socket即时通信系统...

    java使用socket和c++通信

    在Java中,非阻塞式Socket通信基于NIO(Non-blocking Input/Output)机制,它与传统的BIO(Blocking I/O)不同,BIO在等待数据时会阻塞线程,而NIO则允许线程在没有数据可读或可写时继续执行其他任务,从而提高系统...

    limengjie.zip_java socket _socket

    综上所述,Java Socket单线程通信是网络编程的基础,通过这个课程设计,可以深入理解TCP连接的建立、数据的双向传输以及异常处理等关键概念。实际项目开发中,通常会采用多线程或者NIO(非阻塞I/O)技术来提高服务端...

    基于java socket的聊天-单聊

    Java Socket编程是网络通信的基础,尤其在构建基于TCP/IP协议的客户端-服务器应用程序时,它扮演着关键角色。本教程将深入探讨如何使用Java Socket实现一个简单的单聊系统,包括客户端(ChatSocketClient)和服务器...

    java基于Socket的网络通信

    Java基于Socket的网络通信是Java编程领域中的一个重要知识点,它涉及到如何通过网络在不同设备间交换数据。Socket在计算机网络中扮演着客户端和服务器之间的桥梁角色,使得它们能够相互通信。在这个Java项目中,我们...

    socket多线程通信源码

    "serverandclient.txt"可能是一个简单的服务器和客户端程序的示例,展示了如何使用Java等编程语言实现Socket多线程通信。 在实际开发中,需要注意的是,多线程通信会带来同步和互斥的问题,需要使用适当的锁机制...

    java,socket多线程一对一聊天

    总的来说,"java,socket多线程一对一聊天"项目涵盖了Java网络编程的基础知识,包括Socket通信、多线程以及基本的消息传递机制。虽然不支持并发,但对于学习和理解这些基本概念仍然很有价值。在实际应用中,可以通过...

    TCP-socket.zip_java_java Tcp _java socket _socket_socket多线程

    本压缩包文件"TCP-socket.zip"包含了一个基于Java实现的TCP Socket通信客户端和服务端,且支持多线程并发连接。这个学习资源可以帮助我们深入了解Java中的TCP Socket编程和多线程技术。 首先,让我们来看看TCP协议...

    java socket多线程文件上传下载实例项目

    在高并发环境下,如果服务器使用单线程处理请求,那么在处理一个连接时其他连接必须等待,这会导致性能瓶颈。通过使用多线程,服务器可以同时处理多个连接,每个连接由一个独立的线程负责。然而,当并发数超过一定...

    JAVA socket收发数据,并支持断网自动连接

    在Java编程中,Socket通信是网络应用程序之间进行双向通信的基础。Socket API提供了低级别的网络通信接口,使得开发者能够创建客户端和服务器之间的连接。本话题主要关注如何使用Java Socket实现数据的收发,并在...

    SOCKET+多线程例子

    每个线程可以独立处理一个客户端的通信,避免了因单线程处理导致的阻塞问题,提高了服务效率。 "clisock"可能代表客户端Socket的实现,它负责连接到服务器,发送数据并接收回应。客户端Socket首先需要知道服务器的...

    TCP.rar_java socket 服务端_socket 服务端 java_tcp多线程

    当多个客户端同时连接到服务端时,如果使用单线程处理,服务端将串行处理这些连接,效率低下。因此,我们通常为每个客户端连接创建一个新的线程,让它们并行运行。这提高了服务端的响应速度,使得系统能够同时处理多...

    java socket 聊天系统

    我们可以创建一个线程池或者为每个新连接创建一个新的线程,这样每个线程都可以独立处理与特定客户端的通信,避免了单线程模型下的阻塞问题。同时,客户端也可以使用多线程来并行接收和发送消息,提高用户体验。 在...

    单线程Socket编程实现mysql数据读取

    在这个场景中,我们关注的是如何使用单线程Socket编程来实现从MySQL数据库中读取数据。首先,我们需要理解Socket的基本概念,然后深入探讨如何构建Socket客户端和服务器,以及如何与MySQL数据库进行交互。 **Socket...

Global site tag (gtag.js) - Google Analytics