JAVA网络通讯总结一

一.TCP/UDP Sockets
   1.TCP需要四个方面的数据:
     本地iP,本地应用程序使用的TCP端口,远程IP地址,远程系统响应TCP端口
   
   2.TCP客户端和服务器端操作步骤:
      (1)客户端:建立客户端socket连接==》得到socket的读写流==》操作数据流==》关闭数据流==》关闭socket
     (2)服务器端:建立一个服务器端并开始监听==》使用accept方法获取新的连接==》建立输入输出流==》在已有回话的协议上产生回话==》关闭客户端数据流和socket==》关闭服务器socket
   注意:BIO 方式使得整个处理过程和连接是绑定的,只要连接建立,无论客户端是否有消息发送,都要进行等待处理,一定程度上浪费了服务器端的硬件资源.
        NIO 方式的支持是通过Channel 和Selector 方式来实现,采用的方法为向Channel注册感兴趣的事件,然后通过Selector 来获取到发生了事件的key,如发生了相应的事件,则进行相应的处理,否则则不做任何处.所以NIO效率比BIO效率高
  
   例子:
   客户端: public static void main(String[] args) throws Exception{
   //1.建立与服务器端的连接
   String host="127.0.0.1";
   int port=9527;
   Socket socket=new Socket(host,port);
   //2.读取服务器端返回的流。
   BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
   //3.获取输出流,从而将数据输出到指定地 址和端口的服务器。
   PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
   BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
   boolean flag=true;
  
   while(flag)
   {
   String command=systemIn.readLine();   
   if(command==null ||
   "quit".equalsIgnoreCase(command.trim())){
   flag=false;
   System.out.println("Client quit!");
   out.println("quit");
   out.close();
   in.close();
   socket.close();
   continue;
   }
   out.println(command);
   String response=in.readLine();
   System.out.println(response);
   }
  
}
   服务端:public static void main(String[] args) throws Exception{
//1.指定服务器端口建立监听
int port=9527;
ServerSocket ss=new ServerSocket(port);
System.out.println("Server listen on port: "+port);
//2.ss.accept() 阻塞式的等待客户端的连接,当有客户
//端的连接请求进入时,此方法才返回Socket 对象
Socket socket=ss.accept();
//3.获取接收的消息流,进行处理
BufferedReader in=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
//4.获取输出流对象,从而写入数据返回给客户端。
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);

while(true)
{
//声明写入变量
   String line=in.readLine();
if(line==null)
{
Thread.sleep(100);
continue;
}
if("quit".equalsIgnoreCase(line.trim()))
{
in.close();
out.close();
ss.close();
System.out.println("Server has been shutdown!");
System.exit(0);
}
else{
System.out.println("Message from client: "+ line);
out.println("Server response:"+line);
Thread.sleep(100);
}
   }
    }

    (3)一些关键类的理解
       InetAddress类:表示一个Internet主机地址
       Socket类:实现客户端的socket
      ServerSocket类:实现服务器的socket,等待从网络到达的请求,基于这些请求完成操作,返回相应的结果给请求者。

   3.UDP发送端和接收端操作步骤:
     (1)UDP发送端:初始化DatagramSocket 对象==>初始化DatagramPacket 对象,并绑定此数据所需发送的目标地址==>通过DatagramSocket 发送DatagramPacket 对象到指定的目标地址。
      (2)UDP接收端:初始化DatagramSocket 对象,并指定在某个端口上监听数据==》初始化DatagramPacket 对象,并指定所需接收的数据的大小==》//3.从监听的端口上获取所收到的数据
    
      例子:
     发送端:public static void main(String[] args) throws Exception{
int port=9527;
int aport=9528;
//1.初始化DatagramSocket 对象
DatagramSocket serverSocket=new DatagramSocket(aport);
//2.初始化DatagramPacket 对象,并绑定此数据所需发送的目标地址
byte[] buffer=new byte[65507];
DatagramPacket receivePacket=new DatagramPacket(buffer,buffer.length);
//3.声明发送DatagramPacket
DatagramSocket socket=new DatagramSocket();
//获取本地服务器名
InetAddress server=InetAddress.getByName("localhost");

BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
boolean flag=true;
while(flag)
{
String command=systemIn.readLine();
//通过DatagramSocket 发送DatagramPacket 对象到指定的目标地址。
byte[] datas=command.getBytes("UTF-8");
DatagramPacket packet=new DatagramPacket(datas,datas.length,server,port);
socket.send(packet);

if(command==null ||"quit".equalsIgnoreCase(command.trim()))
{
flag=false;
System.out.println("Client quit!");
socket.close();
continue;
}
serverSocket.receive(receivePacket);
String receiveResponse=new
String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
System.out.println(receiveResponse);
}
}

    接收端:public static void main(String[] args) throws Exception{
int port=9527;
int aport=9528;
//1.初始化DatagramSocket 对象,并指定在某个端口上监听数据。
DatagramSocket server=new DatagramSocket(port);
DatagramSocket client=new DatagramSocket();
//获取本地服务器名
InetAddress serverAddress=InetAddress.getByName("localhost");
//2.初始化DatagramPacket 对象,并指定所需接收的数据的大小。
byte[] buffer=new byte[65507];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);

while(true)
{
//3.从监听的端口上获取所收到的数据。
server.receive(packet);
String line=new
String(packet.getData(),0,packet.getLength(),"UTF-8");

if("quit".equalsIgnoreCase(line.trim()))
{
server.close();
System.exit(0);
}else
{
System.out.println("Message from client: "+ line);
packet.setLength(buffer.length);
String response="Server response:"+line;
byte[] datas=response.getBytes("UTF-8");

DatagramPacket responsePacket=new DatagramPacket(datas,datas.length,serverAddress,aport);
client.send(responsePacket);
Thread.sleep(100);
}
}
}


     4.TCP和UDP的区别:
       (1)TCP/IP是一种可靠的网络数据传输协议,UDP/IP是一种不保证数据一定到达的网络传输协议。
        (2)TCP/IP没有UDP/IP性能好。
        在网络IO操作上有3中方式:BIO,NIO,AIO;java只支持前两种。

猜你喜欢

转载自youkaohasang.iteye.com/blog/1838903