@cxm-2016
2016-09-18T16:27:16.000000Z
字数 1690
阅读 2143
java
kotlin
no
陈小默(水平有限,恳请批评指正)
TCP协议是一种面向连接的网络通信协议。TCP协议会在两台需要连接的设备之间创建一条虚拟链路,并将信息报按照适当的次序放好传送,在接收端收到消息后再正确的还原。TCP协议使用重发机制:当一个通信实体发送一个消息个另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到另一个通信实体的回信,则会再次发送刚才收到的信息。
Java中能够接收到其他通信实体连接请求的类是ServerSocket,其对象用来监听来自客户端的Socket连接,如果没有连接它将一直处于等待状态。
构造方法介绍:
public ServerSocket(int port);
创建一个服务端,并监听port端口
public ServerSocket(int port, int backlog);
创建一个服务端,并设置连接队列的长度,超出限制的连接将直接失败
public ServerSocket(int port, int backlog, InetAddress bindAddr)
如果机器存在多个IP地址可以通过设置InetAddress来讲服务端绑定到指定IP上。
当创建完成服务端后,我们还需要使用accept()方法去监听连接(该方法是线程阻塞的)
fun initService(){
val service = ServerSocket(10000)//推荐1024以上的端口,避免与系统应用冲突
var client = service.accept()
}
Socket在通信中的角色是客户端,用于和一直IP和端口的服务端连接。
常用构造方法如下:
public Socket(String host, int port);
该构造方法指定了服务端的主机地址和端口号,如果连接失败则抛出异常
下面来看一个简单的示例:
这是服务端
fun initService() {
val server = ServerSocket(10000)
val client = server.accept()
val br = BufferedReader(InputStreamReader(client.inputStream))
println(br.readLine())
br.close()
server.close()
}
这是客户端
fun initClient() {
val client = Socket("127.0.0.1", 10000)
client.outputStream.write("Hello! I'm client...\r\n".toByteArray())
client.outputStream.flush()
client.close()
}
在两个程序中分别运行这两个方法就能看见其中的通信过程了
通过上面的例子我们感觉到,这样每次仅能与一个客户端通信是不合适的,为了方便服务端与多个客户端的通信,我们引入了线程操作。我们需要在服务端增加线程操作,每当与一个客户端连接就开启一个线程
fun initService() {
val server = ServerSocket(10000)
while (true) {
val client = server.accept()
Thread(Runnable {
val reader = BufferedReader(InputStreamReader(client.inputStream))
println(reader.readLine())
reader.close()
client.close()
}).start()
}
}
客户端不变
fun initClient() {
val client = Socket("127.0.0.1", 10000)
client.outputStream.write("Hello! I'm client...\r\n".toByteArray())
client.outputStream.flush()
client.close()
}
当我们启动服务端后可以多次启动客户端。