Tcp Socket是面向连接的,所以Server端的accept()方法,一直等着客户端的连接,如果连接成功,则两者进行通信,这种是同步的,因为accept()一直在那儿等着,时刻的等着,实际中的聊天系统是采用异步方式,当有请求的时候就调用accept()方法,没有请求的时候该做什么就做什么去,不需要在那儿等着,不浪费资源,一种异步的方式。这个例子只是为了学习线程而准备的。 
端口有TCP端口和UDP端口两种,端口号都是从0到65535,TCP端口在3层,UDP不是四层就是7层 TCP和UDP的协议也不相同,TCP比UDP安全,更多TCP和UDP区别上google,baidu。 

服务器端编码  

Java代码  

java开发telnet连接工具区分window和linux java tcp client_客户端

 
   
 
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9.   
10. /**
11.  * 服务器端编码
12.  * @author 欧阳平 2009-3-17 
13.  */
14. public class
15. static int port = 5566;//端口号
16. static Vector<Client> clients = new Vector<Client>(10);//存储连接客户信息
17. static ServerSocket server = null; //建立服务器socket
18. static Socket socket = null; //套接字连接
19. /**
20.      * Constructs
21.      */
22. public
23. try
24. "Server start...");  
25. new ServerSocket(port); //初始化服务器套接字
26. while (true) {  
27. //等待连接
28. "连接\n");//得到客户机地址
29. new Client(socket); //实例化一个客户线程(其中线程Client中有Socket,这里的的Socket只是起个过度作用)
30. //
31. //增加客户线程到向量中
32. //启动线程
33. //监视聊天室连接变化
34.             }  
35. catch
36. //输出出错信息
37.         }  
38.     }  
39.       
40. public static void notifyChatRoom() { //监视客户端线程
41. new StringBuffer("newUser");  
42. for (int i = 0; i < clients.size(); i++) {  
43.             Client c = (Client)clients.elementAt(i);  
44. ":"+c.name); //客户端姓名字符串
45.         }  
46. //发送信息到客户端
47.     }  
48.       
49. public static void
50. for (int i= 0
51. //分别得到每个客户端的连接
52. //发送信息
53.         }  
54.     }  
55.       
56. public void closeAll() { //关闭所有连接
57. while (clients.size() > 0 ) { //遍历整个Vector
58. //得到一个客户端
59. try
60.                 client.socket.close();  
61. catch(IOException ex) {  
62. // 输出错误信息
63.             }  
64. //移出客户端
65.         }  
66.     }  
67.       
68. public static void disconnect(Client c) {// 断开客户端
69. try
70. "断开连接\n");  
71. catch
72.             ex.printStackTrace();  
73.         }  
74.         clients.removeElement(c);  
75. null;  
76.     }  
77.       
78.       
79. /**
80.      * main方法
81.      * @param args
82.      */
83. public static void
84. new
85.   
86.     }  
87. class Client extends
88. //连接端口
89. //用户姓名
90. //客户端ip地址
91. //输入流
92. //输出流
93. public
94.             socket = s;  
95. try
96. new BufferedReader(new InputStreamReader(s.getInputStream()));//得到输入流
97. new PrintStream(s.getOutputStream());//得到输出流
98. //读取接收到的信息
99. new StringTokenizer(info,":"); //分解字符串
100. //获取关键字
101.                 System.out.println(stinfo.toString());  
102.                 System.out.println(head);  
103. if
104. //获取用户名
105.                 }  
106. if
107. //获取IP地址
108.                 }  
109. catch
110.                 ex.printStackTrace();  
111.             }  
112.             System.out.println(name);  
113.             System.out.println(ip);  
114.         }  
115.           
116. public void
117. //输出信息
118.             ps.flush();  
119.         }  
120. public void
121. while (true) {  
122. null;  
123. try
124.                       
125.                     line = reader.readLine();  
126. "line:"+line);  
127.                       
128. catch
129. //输出错误信息
130. this);//断开连接
131. //更新信息
132. return
133.                 }  
134. if (line == null) { //客户离开
135. this);  
136.                     ChatServer.notifyChatRoom();  
137. return
138.                 }  
139. new StringTokenizer(line,":");//分解字符串
140.                 String keyword = st.nextToken();  
141. if (keyword.equals("MSG")) { //发送来的聊天信息
142. new StringBuffer("MSG:");  
143. //在信息上增加用户名
144. "\0\n"));  
145. //发送聊天语句到各个客户端
146.                     System.out.println(msg);  
147. else if (keyword.equals("quit")) { //退出命令
148. this); //断开连接
149. //刷新信息
150.                 }  
151.             }  
152.         }  
153.     }  
154.       
155. }  
 


   
 
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12. import
13. import
14. import
15. import
16.   
17. import
18. import
19. import
20.   
21. /**
22.  * 基于Socket网络聊天程序 客户端编码
23.  * @author 欧阳平 2009-3-17 
24.  */
25. public class ChatClient extends JFrame  implements
26.       
27. new TextField(15);//姓名输入文本域
28. new Button("连接");//连接按钮
29. new Button("断开连接");//断开连接按钮
30. new TextArea(8,27);//显示聊天信息文本域
31. new Button("发送");  
32. new TextField(30);//聊天输入
33. new java.awt.List(9);//显示在线用户信息 
34. null;//连接端口
35. null;//输出流
36. null;  
37. //监听线程类
38. class Listen extends
39.         BufferedReader reader;  
40.         PrintStream ps;  
41.         String cname;  
42.         Socket socket;  
43.         ChatClient chatClient;  
44. public
45. try
46. this.chatClient = client;  
47. this.socket = socket;  
48. this.cname = name;  
49. new BufferedReader(new
50. new
51. catch
52.                 e.printStackTrace();  
53.             }  
54.         }  
55. public void
56. while (true) {  
57. null
58. try
59. //读取数据流
60. "客户端:"+line);  
61.                   
62. catch
63.                 ex.printStackTrace();  
64. "quit");; //断开连接
65. return;  
66.             }  
67. new StringTokenizer(line,":"); //分解字符串
68.             String keyword = stinfo.nextToken();  
69. if (keyword.equals("MSG")) {  
70. "\n");  
71.             }  
72. else if (keyword.equals("newUser")){  
73.                 chatClient.list1.clear();  
74. "users", 0);  
75. int i = 1;  
76. while
77.                     chatClient.list1.add(stinfo.nextToken(), i++);  
78.                 }  
79.             }  
80.         }  
81.           
82.       }  
83.     }  
84. public void
85. try{  
86. if(e.getSource()==btConnect) { //点击连接按钮
87. if (socket == null) {  
88. new Socket(InetAddress.getLocalHost(),5566);//实例化一个套接字
89. new PrintStream(socket.getOutputStream());//获取输出流,写入信息
90. new StringBuffer("info:");  
91. ":"+InetAddress.getLocalHost().toString();  
92. //输出信息
93.                     ps.flush();  
94. new Listen(this,tfName.getText(),socket);  
95.                     listen.start();  
96.                 }  
97. else if (e.getSource() == btDisconnect) { //点击断开连接按钮
98.                 disconnect();  
99. else if (e.getSource() == btSend) { //点击发送按钮
100. if (socket != null) {  
101. new StringBuffer("MSG:");  
102. new
103. //发送信息
104.                     ps.flush();  
105. else
106. this, "请先连接!", "提示", 1);  
107.                 }  
108.             }  
109.               
110. catch
111. //输出错误信息
112.         }  
113.     }  
114. public void disconnect() { //断开连接方法
115. if (socket != null) {  
116. "quit");//发送信息
117.             ps.flush();  
118.               
119. null;  
120. "");  
121.         }  
122.     }  
123.       
124.       
125.       
126.       
127.       
128.       
129.   
130.       
131. public
132.           
133.           
134. this.setLayout(new
135.           
136. new
137. new Label("姓名");  
138.         panel1.setBackground(Color.orange);  
139.         panel1.add(label);  
140.         panel1.add(tfName);  
141.         panel1.add(btConnect);  
142.         panel1.add(btDisconnect);  
143. this.add(panel1,BorderLayout.NORTH);  
144.           
145. new
146.         panel2.add(tfChat);  
147.         panel2.add(list1);  
148. this.add(panel2,BorderLayout.CENTER);  
149.           
150. new
151. new Label("聊天信息");  
152.         panel3.add(label2);  
153.         panel3.add(tfMessage);  
154.         panel3.add(btSend);  
155. this.add(panel3,BorderLayout.SOUTH);  
156.           
157. this.setBounds(50,50,400,350);  
158. this.setVisible(true);  
159.           
160. this);  
161. this);  
162. this);  
163.           
164.     }  
165.       
166. /**
167.      * @param args
168.      */
169. public static void
170. new ChatClient(new
171.         System.out.println(client.socket);  
172.     }