计算机在互联网中以IP地址标识
- 内网ip (大多设置为192.168)
- 公网ip 运营商提供一条线路连过来
- 本机ip:127.0.0.1 localhost 可以在完全不联网的情况下使用
端口号,传递给确定的进程
端口号是计算机中的应用程序的标识,0-65535之间,应用程序可以占1个也可以占多个。应尽量避免使用0-1024之间的,已经被知名的软件或windows操作系统占用。
通信协议
交流的标准。对数据的
- 传输速率
- 传入接口
- 步骤控制
- 出错控制
等,指定的标准,通信双方必须同时遵守才能完成数据交换。 - IP 因特网互联协议
ServerSocket
每连接一个客户端,服务器就会得到一个新的socket对象,用于跟客户端进行通信。
ServerSocket(int port);//创建一个基于TCP/IP协议的服务器,并绑定指定端口号
//常用方法
Socket accept();//等待客户端连接,此方法会导致线程阻塞直到新的客户端连接成功,return socket对象后线程再继续执行
void close();//释放占用的端口号,关闭服务器
Socket是两台计算机之间通信的端点,名:套接字
输入输出流
- OutputStream getOutputStream(); 返回指向通信另一端点的输出流
- InputStream get…返回指向通信另一端点的输入流
- void close();关闭套接字。
客户端和服务器的输入输出流是相反的。注意获取顺序
发送:
- OutputStream os = socket.getOutputStream();
- PrintStream ps = new PrintStream(os);
- ps.println(“服务器你好”);
接收: - InputStream is = socket.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String text = br.readLine();
注意必须一个是发送状态一个是接收状态才行
多线程服务器
while(true){
//接收客户端
Socket socket = server.accept();
//创建线程
new Thread(){
@Override
public void run(){
try{
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
}catch(IOException e){
e.printStackTrace();
}
}
}.start();
}
socket常用方法
- 获取输入输出流(上节)
- 获取状态
- 一定要close();
- 连接到服务器 connect();
将快递柜程序改成c/s时遇到的问题:
- 怎么让双方多次互相通信?比如服务器给2行话,客户端回一行,服务器再给1行,再回一行这样连续下去
client和server都新建一个内部类专门负责发送消息。在client和server的run()方法内,让这个new sendMsgThread.start();,然后再开OutputStream。利用os.write()和byte[]来发送和接收字节流,如果接收len=-1则停止。 - 尝试过用socket.shutdownOutputStream()关闭输出流,这样能继续一次,之后输出流就再也打不开了
- 用br.readLine()循环读取输入时,会停住不继续了
while(line!=null&&line.length()>0){
System.out.println(line);
if(line=="bye") break label;
line = br.readLine();//为什么停在这里不继续了
}
- 所以互相通信时如果服务器打开了输出流,那么服务器还能否接收到,就是输入输出流是否会冲突?