Socket编程初步(单向通信)

服务器端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追加)

 

你可能感兴趣的:(java,编程,.net,socket,dos)