1基于Java简单聊天室课程:计算机网络编写时间:2015年11月10日学院:自动化学院专业:物联网工程班级:0851301小组成员:杨鹏2013212708指导老师:魏旻2基于Java简单聊天室一.概述编写语言:本设计采用Java语言,使用UDP传输协议进行编程。编写工具:eclipse+SWTDesigner插件。运行环境:WIN10操作系统,DOS命令行启动运行(盘符:\Chat\binjavachat.Chat)涉及知识:①使用了Java中的图形界面编程(GUI)的类库—AWT框架。②DatagramSocket和DatagramPacket类控制报文二.详细描述2.1编写思路:发送端1.建立udpsocket服务端点。该端点建立,系统会随机分配一个端口。如果不想随机配置,可以手动指定。2.将数据进行packet包的封装,必须要指定目的地地址和端口3.通过socket服务的send方法将该包发出。4.将socket服务关闭。主要是关闭资源。接收端1.建立udp的socket服务。要监听一个端口。2.定义一个缓冲区,将该缓冲区封装到packet包中。3.通过socket的receive方法将数据存入数据包中。4.通过数据包dp的方法getData()、getAddress()、getPort()等方法获取包中的指定信息。5.关闭socket。2.2程序界面:3可与局域网内的主机进行聊天,具有指定网内ip的主机聊天,同时有发送、清屏、关闭程序等基本交互界面。2.2程序代码:Chat.java(文件位于chat/bin中)importjava.awt.*;importjava.awt.event.*;importjava.net.*;importjavax.swing.*;classChatextendsJFrame{TextAreata=newTextArea();JScrollPanejsp=newJScrollPane(ta);TextFieldtfIP=newTextField(15);TextFieldtfData=newTextField();Labellabel=newLabel(IP地址:);Buttonjb_send=newButton(发送);Buttonjb_clear=newButton(清屏);DatagramSocketds=null;4publicChat(){try{ds=newDatagramSocket(8888);}catch(Exceptionex){ex.printStackTrace();}//界面布局this.setLayout(null);this.setLocation(500,150);ta.setBounds(0,0,390,160);label.setBounds(20,170,50,25);tfIP.setBounds(70,170,250,25);jb_clear.setBounds(340,170,40,25);tfData.setBounds(20,200,300,60);jb_send.setBounds(330,220,50,40);this.add(ta);this.add(label);this.add(tfIP);this.add(jb_clear);this.add(tfData);this.add(jb_send);ta.setEditable(false);//接收消息、newthreanewThread(newRunnable(){publicvoidrun(){byte[]buf=newbyte[1024];DatagramPacketdp=newDatagramPacket(buf,buf.length);while(true){try{ds.receive(dp);}catch(Exceptione){e.printStackTrace();}Stringip=dp.getAddress().getHostAddress();Stringdata=newString(dp.getData(),0,dp.getLength());ta.append(ip+:+data+\n);}}}).start();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){if(ds.isClosed()){ds.close();5}dispose();System.exit(0);}});//删除聊天记录jb_clear.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){ta.setText();}});//点击发送jb_send.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){sendActionPerformed(e);}});//回车发送tfData.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){sendActionPerformed(e);}});}//发送消息publicvoidsendActionPerformed(ActionEvente){byte[]buf;buf=tfData.getText().getBytes();DatagramPacketdp=null;if(().equals(tfData.getText())){JOptionPane.showMessageDialog(null,消息不能为空!);}else{try{ta.append(InetAddress.getLocalHost()+:+newString(buf)+\n);dp=newDatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),8888);6ds.send(dp);}catch(Exceptionex){ex.printStackTrace();}tfData.setText();}}publicstaticvoidmain(String[]args){System.out.print(StartChat);ChatmainFrame=newChat();mainFrame.setSize(400,300);mainFrame.setTitle(聊天室);mainFrame.setVisible(true);mainFrame.setResizable(false);}}参考代码示例1.Udp接收端packagecn.itcast.net.p2.udp;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;publicclassUDPSendDemo2{/***@paramargs*@throwsIOException*/publicstaticvoidmain(String[]args)throwsIOException{System.out.println(发送端启动......);/**创建UDP传输的发送端。7*思路:*1,建立udp的socket服务。*2,将要发送的数据封装到数据包中。*3,通过udp的socket服务将数据包发送出去。*4,关闭socket服务。*///1,udpsocket服务。使用DatagramSocket对象。DatagramSocketds=newDatagramSocket(8888);//Stringstr=udp传输演示:哥们来了!;BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));Stringline=null;while((line=bufr.readLine())!=null){byte[]buf=line.getBytes();DatagramPacketdp=newDatagramPacket(buf,buf.length,InetAddress.getByName(192.168.1.100),10000);ds.send(dp);if(886.equals(line))break;}//4,关闭资源。ds.close();}}UDP接收端packagecn.itcast.net.p2.udp;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;publicclassUDPReceDemo2{8/***@paramargs*@throwsIOException*/publicstaticvoidmain(String[]args)throwsIOException{System.out.println(接收端启动......);/**建立UDP接收端的思路。*1,建立udpsocket服务,因为是要接收数据,必须要明确一个端口号。*2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.*3,使用socket服务的receive方法将接收的数据存储到数据包中。*4,通过数据包的方法解析数据包中的数据。*5,关闭资源*///1,建立udpsocket服务。DatagramSocketds=newDatagramSocket(10000);while(true){//2,创建数据包。byte[]buf=newbyte[1024];DatagramPacketdp=newDatagramPacket(buf,buf.length);//3,使用接收方法将数据存储到数据包中。ds.receive(dp);//阻塞式的。//4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。Stringip=dp.getAddress().getHostAddress();intport=dp.getPort();Stringtext=newString(dp.getData(),0,dp.getLength());System.out.println(ip+:+port+:+text);}//5,关闭资源。//ds.close();}9}2.tcp发送端packagecn.itcast.net.p4.tcp;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;importjava.net.UnknownHostException;publicclassClientDemo2{/***@paramargs*@throwsIOException*@throwsUnknownHostException*/publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{//客户端发数据到服务端/**Tcp传输,客户端建立的过程。*1,创建tcp客户端socket服务。使用的是Socket对象。*建议该对象一创