关于socket

以前学习网络编程方面的知识,网络编程课也是随随便便就过去了,并没有学习这门课的内容。闲的时候也有想过如何在eclipse平台用Java写一个类似于qq的网络通讯工具,这个星期也有所实践。

public class ServerMain {
public static void main(String args[]) {
ServerMain sm=new ServerMain();
sm.open();
}

private void open() {
// 在8000端口号上创建服务器端口,8000端口号可能被占
try {
ServerSocket ss=new ServerSocket(8000);
while(true){
Socket s=ss.accept();//服务器在8000端口 {等待}接受连进来的客户端,连进来的客户端s。
//若没有客户端连接服务器,这行代码不往下执行 处于阻塞状态

ToClient fs=new ToClient(s);
fs.start();
}
} catch (IOException e) { //可能有输出输出异常,端口占用无法输入输出
//e.printStackTrace();//打印栈,打印e中的所有异常描述
System.out.println("端口号被占用");
}//电脑无程序2000端口,一般选5000端口以上
}

}

public class ToClient extends Thread{
public Socket s;
public ToClient() {
// TODO Auto-generated constructor stub
}
public ToClient(Socket s) {
this.s=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
/*
* 在连进来的客户端上得到从服务器到客户端的名叫out的数据输出流
*/
OutputStream out =s.getOutputStream();//客户端可能突然关闭,服务区数据流无法输出
while(true){
out.write("你好,客户端。 ".getBytes());//把这句话转换成01编码,通过out写出
out.flush();//强制把out流中的数据刷出到客户端
}
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("用户下线");
}
}
}

这个是我写的两个个应用服务器的类,刚开始看网上类似的代码的时候,总是很难理解其中的socket,一会服务器,一会又是客户端,后来查阅了相关资料:

服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket

服务器为socket绑定ip地址和端口号

服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开

客户端创建socket

客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket

服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求

客户端连接成功,向服务器发送连接状态信息

服务器accept方法返回,连接成功

客户端向socket写入信息

服务器读取信息

客户端关闭

服务器端关闭

原文地址:https://www.cnblogs.com/shuqin233/p/5372425.html