java使用UDP数据报通讯方式QQ聊天系统:服务器、客户端

来源:互联网 发布:淘宝二手镜头店铺推荐 编辑:程序博客网 时间:2024/05/22 11:38

全栈工程师开发手册 (作者:栾鹏)

java教程全解

java实现UDP服务器、客户端

java实现qq聊天系统,需要知道彼此的ip地址和端口号。

数据传输使用UDP数据包,我们将首先发送数据的设为客户端,将响应回复的设为服务器端。

所以需要先启动服务器端,等待客服端的发起,再启动客户端发起数据传输。使用控制台作为数据的输入和输出。

服务器端代码

package com.lp.app.net;import java.net.*;import java.io.*;import java.util.*;//使用udp数据报创建的聊天服务器public class UDPServer{     public static void main(String[] args){           new UDPServer();         } static final int PORT = 4000;//设置服务端口 private byte[] buf = new byte[1000]; private DatagramPacket dgp =new  DatagramPacket(buf,buf.length); private DatagramSocket sk;//服务端构造器,实现读取用户输入和通讯 public UDPServer(){   try{     //实例化数据报     sk = new DatagramSocket(PORT);     System.out.println("服务器启动.................");     while(true){       //等待接收       sk.receive(dgp);       //获取接收信息       String rcvd = "接收到包来自 "+ dgp.getAddress() + ", " + dgp.getPort() + ": "+ new String(dgp.getData(),0,dgp.getLength());       System.out.println(rcvd);       String outMessage ="";          //读取输入         BufferedReader stdin  = new BufferedReader(new InputStreamReader(System.in));         try{             outMessage = stdin.readLine();         }catch(IOException ie){             System.err.println("IO error!");         }       String outString = "服务器说: "+ outMessage;       //拷贝字符到缓存       byte[] buf = outString.getBytes();       //打包数据,发送回信息。       DatagramPacket out = new DatagramPacket(buf,buf.length,dgp.getAddress(),dgp.getPort());       sk.send(out);     }    }catch(SocketException e){      System.err.println("Can't open socket");      System.exit(1);    }catch(IOException e){     System.err.println("Communication error");     e.printStackTrace();     System.exit(1);    } }}

客户端代码

package com.lp.app.net;import java.net.*;import java.io.*;//这是一个使用udp数据报通讯方式的聊天程序的客户端public class UDPClient{     public static void main(String[] args){            new UDPClient();         } private DatagramSocket socket; private InetAddress hostAddress; private byte[] buf = new byte[1000]; private DatagramPacket dp = new DatagramPacket(buf,buf.length);//构造器,这里实现接收用户输入和与服务器通讯  public UDPClient(){   try{       //使用构造器,创建使用本机任何可用端口的数据包Socket       socket = new DatagramSocket();       //获取本地IP       hostAddress = InetAddress.getByName("localhost");       System.out.println("客户端启动............");       while(true){         String outMessage ="";          //读取输入         BufferedReader stdin  = new BufferedReader(new InputStreamReader(System.in));         try{           outMessage = stdin.readLine();         }catch(IOException ie){           System.err.println("IO error!");         }         String outString = "客户端说: "+ outMessage;         byte[] buf = outString.getBytes();         //打包数据,发送数据         DatagramPacket out = new DatagramPacket(buf,buf.length,hostAddress,UDPServer.PORT);         socket.send(out);         //等待服务器返回         socket.receive(dp);         String rcvd = "接收到包来自 "+ dp.getAddress() + ", " + dp.getPort() + ": "+ new String(dp.getData(),0,dp.getLength());         System.out.println(rcvd);      }     }catch(UnknownHostException e){       System.out.println("Can;t open socket");       System.exit(1);     }catch(SocketException e){       System.out.println("Can;t open socket");       e.printStackTrace();       System.exit(1);     }catch(IOException e){       System.err.println("Communication error");       e.printStackTrace();       System.exit(1);     }catch(Exception e){       System.err.println("Communication error");       e.printStackTrace();       System.exit(1);     }     System.out.println("ChatClient over"); }}
原创粉丝点击