1.Socket通讯:
在说java实现的Socket通讯之前先说说Socket通讯。Socket是一个网络通讯面向应用开发的一个底层协议,很多操作系统都是建立在这个协议基础上,对网络进行通讯的。而很多语言在通讯这块的实现也是基于Socket的,所以说Socket它不是一种具体的东西。还有很多TCP/IP应用层协议,都是建立在Socket的基础之上的,例如Http协议,它就是建立在Socket基础上面对web的一个特点领域的应用协议。
2.java的网络通讯实现:
实现TCP协议的通讯:
(1)ServerSocket:
ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
backlog:指定客户连接队列的长度,通讯是并发的,所以需要考虑这个指标。
InetAddress:指定服务器绑定地址。
关于默认构造方法:作用是允许服务器在绑定到特定端口之前,先设置ServerSocket的一些选项。因为一旦服务器与特定端口绑定,有些选项就不能再改变了。
bind(SocketAddress endpoint, int backlog):API中的方法也是为这个构造提供绑定接口所用。
setReuseAddress(boolean on) :设置的是主服务监听的端口可以重用,但是它必须在设置端口前调用才有效,所以此时必须用无参构造。
setSoTimeout(int timeout):设置超时时间,0为无限时间,如果超时会报出异常。
setReceiveBufferSize (int size):设置缓冲区的大小,ServerSocket端设置此大小则所有的Socket都用此大小,除非Socket自己单独设置一个新的缓冲值。
accept():获取连接请求,获取一个队列里面就会少一个。另外,Socket的获取是调用本地方法,不是java自己实现的。:默认情况下不设置地址,地址为本地。如果端口为0,即表示由系统自由分配,一般最好分配一个端口。默认的连接数是50。关于连接数,以及连接的具体实施者都是操作系统,API只是起到调用的效果,而这里设置的连接数也会在两种情况下无效:1.backlog的值大于操作系统的队列值。2.backlog小于0。
Socket:如下面的用法,这个方法与ServerSocket的内容差不多,只是这个是发送请求的,ServerSocket是接收请求的。
import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String args[]) { try { ServerSocket ss = new ServerSocket(65000); while (true) { Socket sk = ss.accept(); InputStream inStream = sk.getInputStream(); DataInputStream dis = new DataInputStream(inStream); System.out.println(dis.readUTF()); dis.close(); sk.close(); } } catch (IOException e) { e.printStackTrace(); } } }
import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; public class TCPClient { public static void main(String args[]) { try { Socket sk = new Socket("127.0.0.1", 65000); OutputStream outStream = sk.getOutputStream(); DataOutputStream dos = new DataOutputStream(outStream); dos.writeUTF("hello server!"); dos.flush(); dos.close(); sk.close(); } catch (Exception e) { e.printStackTrace(); } } }
实现UDP协议的通讯:
import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPServer { public static void main(String args[]) { try { byte[] buffer = new byte[1024]; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); DatagramSocket ds = new DatagramSocket(6666); ds.receive(dp); System.out.println(new String(buffer, 0, dp.getLength())); ds.close(); } catch (Exception e) { e.printStackTrace(); } } }
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class UDPClient { public static void main(String args[]) { try { byte[] buffer = (new String("Hello")).getBytes(); DatagramPacket dp = new DatagramPacket(buffer, buffer.length, new InetSocketAddress("127.0.0.1", 6666)); DatagramSocket ds = new DatagramSocket(5678); ds.send(dp); ds.close(); } catch (Exception e) { e.printStackTrace(); } } }