练习1.服务端
package Dom.com;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class WHLFWDsocket {
public static void main(String[]args) throws Exception {
// 监听指定的端口
int port = 55533;
ServerSocket server = new ServerSocket(port);
//一:输入和输出概念
//输入流(inputstream):对于java程序来说,从程序写入文件叫做输出
//输出流(outputstream):对于java程序来说,从文件读取数据,到java程序叫做输入。
//二:字节流输出(outputstream)
//该类是抽象类,public abstract class OutputStream extends Object implements Closeable, Flushable
//所以如果想调用他的方法,需要通过子类来进行调用,该类的操作是字节,所以叫做字节输出流
//操作文件可以是任意文件。
//1: close()关闭字节输出流,释放资源,类似python中操作文件,最后需要close一样。
//2:write()该方法为重载方法,将相应的内容写入文件中。
//3:flush()是将缓存的数据刷入永久存储(文件)中。
System.out.println("server一直等待连接的到来...");
// server将一直等待连接的到来
Socket socket = server.accept();
// 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
InputStream inputStream = socket.getInputStream();
byte[] bytes;
// 因为可以复用Socket且能判断长度,所以可以一个Socket用到底
while (true){
// 首先读取两个字节表示的长度
int first = inputStream.read();
//如果读取的值为-1 说明到了流的末尾,Socket已经被关闭了,此时将不能再去读取
if(first==1){
break;
}
int second = inputStream.read();
int length = (first<<8) + second;
// 然后构造一个指定长的byte数组
bytes = new byte[length];
// 然后读取指定长度的消息即可
inputStream.read(bytes);
System.out.println("get message from client:"+new String(bytes,"UTF-8"));
}
inputStream.close();
socket.close();
server.close();
}
}
练习2.客户端
package Dom.com;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class WHLKHDsocket {
public static void main(String[]args) throws IOException {
String host = "127.0.0.1";
int port = 55533;
// 要连接的服务端IP地址和端口
// 与服务端建立连接
Socket socket = new Socket(host,port);
// 建立连接后获得输出流
OutputStream outputStream = socket.getOutputStream();
String message = "你好,yiwangd";
//首先需要计算得知消息的长度
byte[] sendBytes = message.getBytes(StandardCharsets.UTF_8);
//然后将消息的长度优先发送出去
outputStream.write(sendBytes.length>>8);
outputStream.write(sendBytes.length);
//然后将消息再次发送出去
outputStream.write(sendBytes);
outputStream.flush();
//如果中途调用close()方法
// 输出区也还是有数据的
// 就像水缸里有水
// 只是在缓冲区遗留了一部分
// 这时如果我们先调用flush()方法
// 就会强制把数据输出,缓存区就清空了
// 最后再关闭读写流调用close()就完成了
//==========此处重复发送一次,实际项目中为多个命名,此处只为展示用法
message = "第二条信息";
sendBytes = message.getBytes(StandardCharsets.UTF_8);
outputStream.write(sendBytes.length>>8);
outputStream.write(sendBytes.length);
outputStream.write(sendBytes);
outputStream.flush();
//==========此处重复发送一次,实际项目中为多个命名,此处只为展示用法
message = "the third message!";
sendBytes = message.getBytes(StandardCharsets.UTF_8);
outputStream.write(sendBytes.length>>8);
outputStream.write(sendBytes.length);
outputStream.write(sendBytes);
outputStream.close();
socket.close();
}
}