`
free9277
  • 浏览: 104580 次
  • 性别: 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编写的简易socket通信,既有单线程socket通信也有多线程socket通信,使用Java原生sdk实现,可以运行。

    java socket 单线程实现P2P通信

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

    limengjie.zip_java socket _socket

    java socket单线程通信,可以作为课程设计

    java socket通信 一对多

    1)设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的... 6,注意理解程序的线程、Socket的基本动作(Accept、Connect、Send、Receive)等;

    大二Java课程作业,基于Java Socket的C/S架构IM

    实现了C/S架构的Socket多线程IO通信。 实现了Socket长连接的TCP网络通信。 基于Java GUI的人机交互界面,单个服务器(Server)持续处理客户端信息并统一转发,多个客户端(Client)可以同时持续与服务器建立连接并相互...

    java实现Socket通信之单线程服务

    主要为大家详细介绍了java实现Socket通信的单线程服务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    基于Java Socket的C/S架构IM

    实现了C/S架构的Socket多线程IO通信。 实现了Socket长连接的TCP网络通信。 基于Java GUI的人机交互界面,单个服务器(Server)持续处理客户端信息并统一转发,多个客户端(Client)可以同时持续与服务器建立连接并相互...

    Java的多线程和socket实现聊天室代码

    Java实现简单的聊天室,单服务进程,多客户线程,用socket进行通信。适合新手学习socket。

    一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)

    思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    暂时仅仅设计了以下几个功能点: 1.点对点单人聊天; 2.多人在线同时聊天; 3.用户可以自由加入和退出系统; 4.具备用户在线状态监听;

    cc_to_sever.zip

    java多线程socket通信、java网络编程学习心得,基本实现多线程通信,其他问题的欢饮反馈。应付作业有余了: 应用多线程实现服务器与多客户端之间的通信: ① 服务器端创建ServerSocket,循环调用accept()等待客户端...

    基于javatcpsocket通信的拆包和装包源码-NettyTree:网状树

     1)单线程模型,所有的IO操作都在一个NIO线程上完成   存在性能和可靠性上的问题  2)多线程模型,有一组NIO线程处理IO操作   有一个专门的NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求;   ...

    Java实现的企业内部QQ聊天系统

    Java实现的企业内部QQ聊天系统,Socket线程通信,单人,多人在线聊天

    安卓平台客户端-服务器socket通信_源码带注释

    移动客户端在Android平台下、服务器端使用纯JAVA语言的socket通信开发。子文件夹按单线程和多线程、客户端和服务器端分类,代码包含详尽注释。 在移动端为Android 2.3手机、服务器端为WINDOWS PC的环境下真机亲测,...

    java源码包---java 源码 大量 实例

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

    JAVA上百实例源码以及开源项目源代码

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

    java源码包4

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

    JAVA上百实例源码以及开源项目

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

    java源码包3

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

Global site tag (gtag.js) - Google Analytics