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();
}
}
}