网络Socket编程TCP协议例子

简介:

 1.单线程TCP服务端

复制代码
 1 public class TcpChatServer {
 2 
 3     private Integer port=8000;
 4     private ServerSocket serverSocket;
 5     
 6     public static void main(String[] args)throws Exception  {
 7         
 8         new TcpChatServer().service();
 9     }
10     
11     public TcpChatServer() throws Exception {
12         //启动一个服务监听一个指定的端口port
13         serverSocket=new ServerSocket(port);
14         System.out.println("service started!");
15     }
16     
17     private void service(){
18         while (true) {
19             Socket socket=null;
20             try {
21                 //serversocket开始监听服务,客户端和服务端交互的socket
22                 socket=serverSocket.accept();
23                 System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
24                 //获取客户端的数据对象
25                 BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
26                 //写入客户端的数据对象
27                 PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
28                 String word;
29                 while ((word=reader.readLine())!=null) {
30                     //相应请求
31                     writer.println(reply(word));
32                     //如果用户输入bye则退出循环
33                     if(word.equals("bye")){
34                         break;
35                     }
36                 }
37             } catch (IOException e) {
38                 System.err.println(e.getMessage());
39             }finally{
40                 //一定要关闭socket
41                 if(socket!=null){
42                     try {
43                         socket.close();
44                     } catch (IOException e) {
45                         System.err.println(e.getMessage());
46                     }
47                 }
48             }
49         }
50     }
51     
52      //回复相应
53     private String reply(String word){
54         return "you said :"+word;
55     }
56 }
复制代码

 

运行...在cmd下访问....使用telnet访问....

 

 但是有一个问题...如果再开一个telnet访问的话输入什么都是没有效果的...只有等到第一个结束之后才会对第二个访问的telnet进行回复,如下图.

 

 搞一个多线程的Socket服务端.

 

复制代码
 1 public class TcpThreadChatServer {
 2 
 3     private Integer port=8000;
 4     private ServerSocket serverSocket;
 5     
 6     public static void main(String[] args)throws Exception  {
 7         
 8         new TcpThreadChatServer().service();
 9     }
10     
11     public TcpThreadChatServer() throws Exception {
12         //启动一个服务监听一个指定的端口port
13         serverSocket=new ServerSocket(port);
14         System.out.println("service started!");
15         
16     }
17     
18     private void service(){
19         
20         while (true) {
21             Socket socket=null;
22             
23             try {
24                 //serversocket开始监听服务,客户端和服务端交互的socket
25                 socket=serverSocket.accept();
26                 //对于每次请求,多线程应答  可以开多个可以对多个客户端进行回应.
27                 new Thread(new Worker(socket)).start();
28             } catch (IOException e) {
29                 System.err.println(e.getMessage());
30             }
31         }
32     }
33     
34     class Worker implements Runnable{
35         public Worker(Socket socket) {
36             this.socket = socket;
37         }
38         private Socket socket;
39         
40         @Override
41         public void run() {
42             
43             try {
44                 System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
45                 //获取客户端的数据对象
46                 BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
47                 //写入客户端的数据对象
48                 PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
49                 String word;
50                 while ((word=reader.readLine())!=null) {
51                     //相应请求
52                     writer.println(reply(word));
53                     //如果用户输入bye则退出循环
54                     if(word.equals("bye")){
55                         break;
56                     }
57                 }
58             } catch (Exception e) {
59                 System.err.println(e.getMessage());
60             }finally{
61                 if(socket!=null){
62                     try {
63                         socket.close();
64                     } catch (IOException e) {
65                         System.err.println(e.getMessage());
66                     }
67                 }
68             }
69         }
70     }
71     
72      //回复相应
73     private String reply(String word){
74         return "you said :"+word;
75     }
76 }
复制代码

 

可以开启多个telnet访问 并同时处理反馈.....

可以写对应的如下客户端...通过控制台访问该服务端,不再使用telnet...

复制代码
 1 public class TcpChatClient {//客户端和服务端通话都是过socket
 2 
 3     private Socket socket;
 4     private String host="localhost";//要请求的服务器地址
 5     private Integer port=8000;
 6     
 7     public TcpChatClient() throws Exception {
 8         //初始化一个客户端socket
 9         socket=new Socket(host, port);
10         System.out.println("connect ok!");
11     }
12     
13     public static void main(String[] args) throws Exception {
14         
15         new TcpChatClient().say();
16     }
17 
18     private void say() throws Exception {
19         //两个reader对象
20         //本地的system.in 的reader
21         BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
22         //和服务器交互的writer【PrintWriter 的自动flush 功能】  这个ture参数非常重要  .
23         PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
24         //和服务器交互的reader
25         BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
26         
27         String word;
28         String readLine;
29         while ((word=localReader.readLine())!=null){
30             //请求服务端来获取数据
31             writer.println(word);
32             //打印到控制台上
33             readLine = reader.readLine();
34             System.out.println(readLine);
35             
36             //如果用户输入bye则退出循环 
37             if (word.equals("bye")){
38                 socket.close();
39                 break;
40             }
41         }
42     }
43 }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6681390.html,如需转载请自行联系原作者

相关文章
|
6月前
|
数据采集 算法 数据挖掘
模块化控制协议(MCP)在网络中增强智能体执行效率的研究
随着Web3技术的迅速发展,去中心化应用和智能体在各种领域的应用逐渐增多。MCP(Modularized Control Protocol,模块化控制协议)作为一种增强智能体执行能力的关键技术,为Web3场景中的智能体提供了更强的灵活性和可扩展性。本文将探讨如何利用MCP技术提升智能体在Web3场景中的执行能力,并通过实例代码展示其实现路径。
543 22
|
3月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
8月前
|
域名解析 网络协议 安全
计算机网络TCP/IP四层模型
本文介绍了TCP/IP模型的四层结构及其与OSI模型的对比。网络接口层负责物理网络接口,处理MAC地址和帧传输;网络层管理IP地址和路由选择,确保数据包准确送达;传输层提供端到端通信,支持可靠(TCP)或不可靠(UDP)传输;应用层直接面向用户,提供如HTTP、FTP等服务。此外,还详细描述了数据封装与解封装过程,以及两模型在层次划分上的差异。
1946 13
|
4月前
|
运维 架构师 安全
二层协议透明传输:让跨域二层协议“无感穿越”多服务商网络
简介:本文详解二层协议透明传输技术,适用于企业网工、运营商及架构师,解决LLDP/LACP/BPDU跨运营商传输难题,实现端到端协议透传,提升网络韧性与运维效率。
|
6月前
|
网络协议 API
区分TCP/IP、HTTP、Socket三者的差异
HTTP关注于应用层的协议规范,而Socket关注于为应用程序提供编程中的网络功能,这些功能本身是建立在底层的TCP/IP协议之上;HTTP是更高层次的抽象,定义了如何包装数据,而TCP/IP定义了如何传送数据,Socket则是两者之间在程序中的桥梁,负责实现细节。在实际应用中,通常HTTP通信也是通过Socket来完成,因为HTTP仅是具体内容的封装形式,而Socket则是传送方式的实现形式。
590 16
|
6月前
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
2556 3
|
8月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
242 18
|
9月前
|
网络协议
TCP/IP与OPC协议的深度比较
总的来说,TCP/IP和OPC协议各有其优点和应用场景。TCP/IP协议是网络通信的基础,而OPC协议则是工业自动化领域的重要工具。在实际应用中,我们需要根据具体的需求和场景,选择合适的协议。
370 11
|
9月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
285 22
|
9月前
|
网络协议 数据安全/隐私保护 网络架构