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