Java TCP/IP Socket 编程 笔记(二)—TCP的例子


1.InetAddress类和SocketAddress用于识别网络主机
TCP协议客户端和服务器端的套接字为Socket和ServerSocket
UDP协议的客户端和服务器端的套接字为DatagramSocket

2.
类 NetworkInterface表示一个由名称和分配给此接口的 IP 地址列表组成的网络接口,其getNetworkInterfaces()返回此机器上的所有接口。getInetAddresses()是返回一个 Enumeration 并将所有 InetAddress 或 InetAddress 的子集绑定到此网络接口的便捷方法。(注意:一个网络接口可能包含IPv4或IPv6地址)

3.类 InetAddress的getHostAddress()返回 IP 地址字符串(以文本表现形式)。 getAllByName(String host)在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。getHostName()获取此 IP 地址的主机名。getHostAddress() 返回 IP 地址字符串(以文本表现形式)。

4.TCP套接字
服务器端ServerSocket实例监听TCP链接请求,并为每个请求创建新的Socket实例。也就是说,服务器端要同时处理ServerSocket实例和Sockete实例,而客户端只需要使用Socket实例。

TCP客户端:
Java代码  收藏代码

    public class TCPEchoClient {  
        public static void main(String [] args) throws UnknownHostException, IOException, InterruptedException {  
            if(args.length<2||args.length>3){  
                throw new IllegalArgumentException("Parameter(s):<Server> <Word> [<Port>]");  
            }  
              
            String server=args[0];  
              
            byte [] data=args[1].getBytes();  
              
            int servPort=(args.length==3)?Integer.parseInt(args[2]):7;  
              
            //1.创建一个Socket实例:构造函数向指定的远程主机和端口建立一个TCP连接  
            Socket socket=new Socket(server,servPort);  
            System.out.println("Connected to server... sending echo string");  
              
            /** 
             *2. 通过套接字的输入输出流进行通信:一个Socket连接实例包括一个InputStream和一个OutputStream,它们的用法同于其他Java输入输出流。 
             */  
            InputStream in=socket.getInputStream();  
            OutputStream out=socket.getOutputStream();  
              
            out.write(data);  
              
            int totalBytesRcvd=0;  
            int bytesRcvd;  
              
            while(totalBytesRcvd<data.length){  
                if((bytesRcvd=in.read(data, totalBytesRcvd, data.length-totalBytesRcvd))==-1){  
                    throw new SocketException("Connection closed prematurely");  
                }  
                totalBytesRcvd+=bytesRcvd;  
            }  
            System.out.println("Receved: "+new String(data));  
              
            //3.使用Socet类的close()方法关闭连接  
            socket.close();  
        }  
    }  




TCP服务器端代码:
Java代码  收藏代码

    public class TCPEchoServer {  
        private static final int BUFSIZE=32;  
          
        public static void main(String [] args) throws IOException, InterruptedException{  
            if(args.length!=1){  
                throw new IllegalArgumentException("Parameter(s):<Port>");  
            }  
              
            int servPort=Integer.parseInt(args[0]);  
              
            //1.创建一个ServerSocket实例并制定本地端口。此套接字的功能是侦听该制定端口收到的连接。  
            ServerSocket servSock=new ServerSocket(servPort);  
              
            int recvMsgSize;  
              
            byte [] receiveBuf=new byte[BUFSIZE];  
              
            //2.重复执行  
            while(true){  
                //a.调用ServerSocket的accept()方法以获取下一个客户端连接。  
                //基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回  
                Socket clntSock=servSock.accept();  
                SocketAddress clientAddress=clntSock.getRemoteSocketAddress();  
                System.out.println("Handling client at "+clientAddress);  
                  
                //b,使用所返回的Socket实例的InputStream和OutputStream与客户端进行通信  
                InputStream in=clntSock.getInputStream();  
                OutputStream out=clntSock.getOutputStream();  
      
                while((recvMsgSize=in.read(receiveBuf))!=-1){  
                    out.write(receiveBuf, 0, recvMsgSize);  
                }  
              
                //c,通信完成后,使用Socket的close()方法关闭该客户端套接字链接  
                clntSock.close();  
            }  
        }  
    }  

你可能感兴趣的:(socket)