您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Socket编程(Java)
Socket编程(JAVA)Socket,套接字Socket和ServerSocket类库位于java.net包中ServerSocket用于服务器端Socket用于建立网络连接连接成功时,应用程序两端都会产生一个Socket对象1.基于Socket的通信基于Socket的通信套接字的组成IP地址端口号,16位整数端口号与IP地址的组合得出一个网络套接字。基于Socket的通信重要的SocketAPIaccept(),阻塞,直到接受一个连接,并且返回一个客户端的Socket对象getInputStream(),获得网络连接输入,同时返回一个InputStream对象getOutputStream(),连接的另一端将得到输入,同时返回一个OutputStream对象两个方法都需要捕捉IOException基于Socket的通信Server-Client模型的程序服务器端使用ServerSocket监听指定的端口等待客户连接请求客户连接后,会话产生;在完成会话后,关闭连接。客户端使用Socket发出连接请求一旦连接成功,打开会话;会话完成后,关闭Socket。基于Socket的通信Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的客户端Socket的构造方法:Socket(Stringhost,intport)host---服务器地址port---端口号例:Socketmysocket=newSocket(“”,2880);Socketmysocket=newSocket(“127.0.0.1”,2880);2.建立客户端Socket对象建立套接字时可能发生IOException异常,应当捕获:try{Socketmysocket=newSocket(“”,2880);}catch(IOExceptione){…..}当连接建立后,可使用getInputStream()方法获得一个输入流,用于接收服务器发来的信息;使用getOutputStream()方法获得一个输出流,用于将信息发送至服务器端。建立客户端Socket对象为响应客户端的呼叫,服务器端必须建立一个等待接收连接的服务器套接字。try{ServerSocketserversocket=newServerSocket(2880);}catch(IOExceptione){…..}3.建立服务器端套接字当服务器的套接字连接serversocket建立后,可使用ServerSocket类中的accept()方法接收客户端连接请求Socketsc=serversocket.accept();同样,应当捕获IOException异常4.接收客户端连接请求5.网络连接模式客户端服务器端ServerSocket(port)accept()OutputStreamInputStreamOutputStreamInputStreamclose()close()Socket(host,port)建立客户端程序1.importjava.io.*;2.importjava.net.*;3.publicclassClient4.{5.publicstaticvoidmain(Stringargs[])6.{Strings=null;7.Socketmysocket;8.DataInputStreamin=null;9.DataOutputStreamout=null;7.例:一个简单的通信程序10.try{11.mysocket=newSocket(localhost,3456);12.in=newDataInputStream(13.mysocket.getInputStream());14.out=newDataOutputStream(15.mysocket.getOutputStream());16.out.writeUTF(hello!);17.while(true)18.{s=in.readUTF();19.if(s!=null)break;}20.mysocket.close();21.}例:一个简单的通信程序22.catch(IOExceptione)23.{24.System.out.println(notconnected);25.}26.System.out.println(s);27.}28.}例:一个简单的通信程序服务器端程序1.importjava.io.*;2.importjava.net.*;3.publicclassServer4.{5.publicstaticvoidmain(Stringargs[])6.{ServerSocketserver=null;7.Socketclient=null;8.Strings=null;9.DataInputStreamin=null;10.DataOutputStreamout=null;例:一个简单的通信程序11.try12.{server=newServerSocket(3456);}13.catch(IOExceptione1)14.{System.out.println(Error:+e1);}15.try{16.client=server.accept();17.in=newDataInputStream(18.client.getInputStream());19.out=newDataOutputStream(20.client.getOutputStream());例:一个简单的通信程序21.while(true)22.{s=in.readUTF();23.if(s!=null)break;24.}25.out.writeUTF(Hello,Iamserver.);26.client.close();27.}28.catch(IOExceptione)29.{System.out.println(Erro:+e);}30.}31.}例:一个简单的通信程序如果允许多个客户同时连接到服务器上,可以利用多线程来实现。for(inti=0;i10;i++){Socketincoming=s.accept();System.out.println(Spawning+i);newThreadHandler(incoming,i).start();}16.4.4服务多个客户1.publicvoidrun()2.{try3.{DataInputstreamin=new4.DataInputstream(incoming.getInputStream());5.DataOutputStreamout=new6.DataOutputStream(incoming.getOutputStream());7.out.println(Hello!EnterBYEtoexit.);8.booleandone=false;9.while(!done)10.{Stringstr=in.readLine();11.if(str==null)done=true;16.4.4服务多个客户12.else13.{out.println(Echo+i+str);14.if(str.trim().equals(BYE))15.done=true;16.}17.}18.incoming.close();19.}20.catch(Exceptione)21.{System.out.println(e);}22.}16.4.4服务多个客户数据报是一种无连接的通信服务:速度快稳定性差DatagramSocket类实现了一种适用于数据报的SocketDatagramPacket类8.基于数据报的通信服务器端publicclassUdpServer{publicstaticvoidmain(String[]args)throwsIOException{//新建一个DatagramSocketDatagramSocketserver=newDatagramSocket(5050);//接收客户端发送来的消息byte[]recvBuf=newbyte[100];DatagramPacketrecvPacket=newDatagramPacket(recvBuf,recvBuf.length);server.receive(recvPacket);StringrecvStr=newString(recvPacket.getData(),0,recvPacket.getLength());System.out.println(客户端传来消息:+recvStr);//往客户端发送消息intport=recvPacket.getPort();InetAddressaddr=recvPacket.getAddress();StringsendStr=Hello!I'mServer;byte[]sendBuf=sendStr.getBytes();DatagramPacketsendPacket=newDatagramPacket(sendBuf,sendBuf.length,addr,port);server.send(sendPacket);//关闭DatagramSocketserver.close();}}客户端publicclassUdpClient{publicstaticvoidmain(String[]args)throwsIOException{//新建一个DatagramSocketDatagramSocketclient=newDatagramSocket();//往服务端发送消息StringsendStr=Hello!I'mClient;byte[]sendBuf=sendStr.getBytes();InetAddressaddr=InetAddress.getByName(“127.0.0.1”);intport=5050;DatagramPacketsendPacket=newDatagramPacket(sendBuf,sendBuf.length,addr,port);client.send(sendPacket);//接受服务端传来的消息byte[]recvBuf=newbyte[100];DatagramPacketrecvPacket=newDatagramPacket(recvBuf,recvBuf.length);client.receive(recvPacket);StringrecvStr=newString(recvPacket.getData(),0,recvPacket.getLength());System.out.println(服务端传来消息:+recvStr);//关闭DatagramSocketclient.close();}}Questions?
本文标题:Socket编程(Java)
链接地址:https://www.777doc.com/doc-6205880 .html