您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > java网络编程实现一个聊天程序
序序jjava网络编程实现一个聊天程序ava网络编程实现一个聊天程序网络编程l网络模型OSI参考模型TCP/IP参考模型l网络通讯要素IP地址端口号传输协议网络参考模型网络通讯要素lIP地址:InetAddress网络中设备的标识不易记忆,可用主机名本地回环地址:127.0.0.1 主机名:localhostl端口号用于标识进程的逻辑地址,不同进程的标识有效端口:0~65535,其中0~1024系统使用或保留端口。l传输协议通讯的规则常见协议:TCP,UDPTCP和UDP1lUDP将数据及源和目的封装成数据包中,不需要建立连接每个数据报的大小在限制在64k内因无连接,是不可靠协议不需要建立连接,速度快lTCP建立连接,形成传输数据的通道。在连接中进行大数据量传输通过三次握手完成连接,是可靠协议必须建立连接,效率会稍低SocketlSocket就是为网络服务提供的一种机制。l通信的两端都有Socket。l网络通信其实就是Socket间的通信。l数据在两个Socket间通过IO传输。UDP传输lDatagramSocket与DatagramPacketl建立发送端,接收端。l建立数据包。l调用Socket的发送接收方法。l关闭Socket。发送端与接收端是两个独立的运行程序。发送端l在发送端,要在数据包对象中明确目的地IP及端口。DatagramSocketds=newDatagramSocket();byte[]by=“hello,udp”.getBytes();DatagramPacketdp=newDatagramPacket(by,0,by.length,InetAddress.getByName(“127.0.0.1”),10000);ds.send(dp);ds.close();接收端l在接收端,要指定监听的端口。DatagramSocketds=newDatagramSocket(10000);byte[]by=newbyte[1024];DatagramPacketdp=newDatagramPacket(by,by.length);ds.receive(dp);Stringstr=newString(dp.getData(),0,dp.getLength());System.out.println(str+--+dp.getAddress());ds.close();Tcp传输最容易出现的问题l客户端连接上服务端,两端都在等待,没有任何数据传输。l通过例程分析:因为read方法或者readLine方法是阻塞式。l解决办法:自定义结束标记使用shutdownInput,shutdownOutput方法。演示tcp传输。2演示tcp传输。1,tcp分客户端和服务端。2,客户端对应的对象是Socket。服务端对应的对象是ServerSocket。客户端,通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。因为tcp是面向连接的。所以在建立socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。需求:给服务端发送给一个文本数据。步骤:1,创建Socket服务。并指定要连接的主机和端口。importjava.io.*;importjava.net.*;class TcpClient{publicstaticvoidmain(String[]args)throwsException {//创建客户端的socket服务。指定目的主机和端口Sockets=newSocket(192.168.1.254,10003);//为了发送数据,应该获取socket流中的输出流。OutputStreamout=s.getOutputStream();out.write(tcpgemenlaile.getBytes());s.close();}}需求:定义端点接收数据并打印在控制台上。服务端:1,建立服务端的socket服务。ServerSocket();并监听一个端口。2,获取连接过来的客户端对象。通过ServerSokcet的accept方法。没有连接就会等,所以这个方法阻塞式的。3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。4,关闭服务端。(可选)3class TcpServer{publicstaticvoidmain(String[]args)throwsException{//建立服务端socket服务。并监听一个端口。ServerSocketss=newServerSocket(10003);//通过accept方法获取连接过来的客户端对象。while(true){Sockets=ss.accept();Stringip=s.getInetAddress().getHostAddress();System.out.println(ip+.....connected);//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。InputStreamin=s.getInputStream();byte[]buf=newbyte[1024];intlen=in.read(buf);System.out.println(newString(buf,0,len));s.close();//关闭客户端.}//ss.close();}}-----------------------------------------------------------------------------------------------importjava.io.*;importjava.net.*;/*演示tcp的传输的客户端和服务端的互访。需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。客户端:1,建立socket服务。指定要连接主机和端口。2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。4,关闭客户端资源。classTcpClient2 {publicstaticvoidmain(String[]args)throwsException {Sockets=newSocket(192.168.1.254,10004);OutputStreamout=s.getOutputStream();4out.write(服务端,你好.getBytes());InputStreamin=s.getInputStream();byte[]buf=newbyte[1024];intlen=in.read(buf);System.out.println(newString(buf,0,len));s.close();}}classTcpServer2{publicstaticvoidmain(String[]args)throwsException{ServerSocketss=newServerSocket(10004);Sockets=ss.accept();Stringip=s.getInetAddress().getHostAddress();System.out.println(ip+....connected);InputStreamin=s.getInputStream();byte[]buf=newbyte[1024];intlen=in.read(buf);System.out.println(newString(buf,0,len));OutputStreamout=s.getOutputStream();Thread.sleep(10000);out.write(哥们收到,你也好.getBytes());s.close();ss.close();}}----------------------------------------------------------------------------------------------编写一个聊天程序。有收数据的部分,和发数据的部分。这两部分需要同时执行。那就需要用到多线程技术。一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义两个run方法。而且这两个方法要封装到不同的类中。importjava.io.*;importjava.net.*;5classSendimplementsRunnable{privateDatagramSocketds;publicSend(DatagramSocketds){this.ds=ds;}publicvoidrun(){try{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.255),10002);ds.send(dp);if(886.equals(line))break;}}catch(Exceptione){thrownewRuntimeException(发送端失败);}}}classReceimplementsRunnable{privateDatagramSocketds;publicRece(DatagramSocketds){this.ds=ds;}publicvoidrun(){try{while(true){byte[]buf=newbyte[1024];DatagramPacketdp=newDatagramPacket(buf,buf.length);ds.receive(dp);Stringip=dp.getAddress().getHostAddress();Stringdata=newString(dp.getData(),0,dp.getLength());if(886.equals(data)){System.out.println(ip+....离开聊天室);break;}System.out.println(ip+:+data);}}catch(Exceptione){thrownewRuntimeException(接收端失败);6}}}class ChatDemo{publicstaticvoidmain(String[]args)throwsException{DatagramSocketsendSocket=newDatagramSocket();DatagramSocketreceSocket=newDatagramSocket(10002);newThread(newSend(sendSocket)).start();newThread(newRece(receSocket)).start();}}7
本文标题:java网络编程实现一个聊天程序
链接地址:https://www.777doc.com/doc-7315056 .html