服务器端TCPServer .java
package com.javaeye.kang.socket; import java.net.ServerSocket; import java.net.Socket; //Socket 服 务 器端 public class TCPServer { public static void main(String[] args) throws Exception { // 创 建一个 Socket 服 务 器端, 带 有端口号(能 让 客 户 端能具体 连过 来) ServerSocket ss = new ServerSocket(6666); //Server 端 傻 等 Socket s = ss.accept(); System. out .println( "a client accept!" ); } }
客户端TCPClient .java
package com.javaeye.kang.socket; import java.net.Socket; //Socket 客 户 端 public class TCPClient { public static void main(String[] args) throws Exception { // 创 建一个客 户 端,指定服 务 器端的 IP 地址和端口号,即具体 连 接 “ 对 象 ” Socket s = new Socket( "127.0.0.1" ,6666); } }
弊端:Server提供一次服务后,就结束了
改进: TCPServer .java 持续服务(使用 While 死循环)
package com.javaeye.kang.socket; import java.net.ServerSocket; import java.net.Socket; //Socket 服 务 器端 public class TCPServer { public static void main(String[] args) throws Exception { // 创 建一个 Socket 服 务 器端, 带 有端口号(能 让 客 户 端能具体 连过 来) ServerSocket ss = new ServerSocket(6666); //Server 端 傻 等 ,死循环 while(true) { Socket s = ss.accept(); System.out.println("a client accept!"); } } }
客户端连上服务器端后,向服务器端发消息。
TCPServer .java
package com.javaeye.kang.socket; import java.io.DataInputStream; import java.net.ServerSocket; import java.net.Socket; //Socket 服 务 器端 public class TCPServer { public static void main(String[] args) throws Exception { // 创 建一个 Socket 服 务 器端, 带 有端口号(能 让 客 户 端能具体 连过 来) ServerSocket ss = new ServerSocket(6666); //Server 端 傻 等,死循 环 while ( true ) { // 阻塞式 傻 等 Socket s = ss.accept(); // 服 务 器端接收数据,作 为输 入流 DataInputStream dis = new DataInputStream(s.getInputStream()); // 读 出 输 入流中的数据, readUTF 也是阻塞式 傻 等 System. out .println(dis.readUTF()); // 关闭 管道 dis.close(); } } }
TCPClient .java
package com.javaeye.kang.socket; import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; //Socket 客 户 端 public class TCPClient { public static void main(String[] args) throws Exception { // 创 建一个客 户 端,指定服 务 器端的 IP 地址和端口号,即具体 连 接 “ 对 象 ” Socket s = new Socket( "127.0.0.1" ,6666); // 客 户 端 说话 ,作 为输 出流 OutputStream os = s.getOutputStream(); // 套管道 DataOutputStream dos = new DataOutputStream(os); // 客 户 端 说话 dos.writeUTF( "Hello Server!" ); dos.flush(); // 最后 关闭 dos.close(); os.close(); } }
先启动那个服务器端,见图 2
再运行客户端,运行一次,往服务器端写一句话。见图 3
这个程序的问题:如果有一个客户端连上来的时候,进入 while ,但是并没有立即利用服务(向服务器端写数据),此时就导致别的客户端就连不上来了。这样的 TCP Server 是有问题的。以前一直是同步 IO ,这个在处理 TCP Server 是有问题的( C 和 C++ 在 TCP Server 端比较棒!)。不过,现在 Java 已经开始提供异步 IO 了。
说明:必须先起 Server 服务,再起 Client ,否则肯定会报连接错误。见图 1
-》这个报错信息也很自然,你服务器端的Server服务还没启动,你让人家Client连接谁呀?(20090507追加)