在客户/服务器通信模式中, 服务器端需要创建监听端口的 ServerSocket, ServerSocket 负责接收客户连接请求. 我们模拟用eclipse模拟服务端,用windows的命令行界面来模拟客户端。
- 我们的电脑一般没有开启telnet服务,我们先在电脑上开启telnet服务,我的电脑(windows10)下面如何开启telnet如下图所示
- 我们先写一个方法,相当于在客户端向服务端发送消息,而服务端只能接受消息无法发送消息
public static void test1() {
try {
// 创建一个服务端,我们监听8888的端口
ServerSocket serverSocket =new ServerSocket(8888);
// 等待客户端连接过来
Socket socket= serverSocket.accept();
// 将客户端的内容放入流中,然后将流用Scanner包住
InputStream is=socket.getInputStream();
Scanner scanner=new Scanner(is);
// 将流中的内容读取出来,输入到控制台(服务端)
while(scanner.hasNextLine()){
System.out.println(scanner.nextLine());
}
scanner.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我们来测试一下这个方法是否有用,打开windows命令行界面输入“telnet 192.168.20.152 8888”,192.168.20.152是我的ip,8888是我开放的端口
在按住ctrl + [+] ,最后按住enter,就可以在上面显示文字了,不然不会显示出来的。
这个方法写的是成功的,实现了我们想要的功能
- 客户端和用户端实现相互通讯的方法,但是有缺陷,只能一问一答
// 客户端和用户端实现相互通讯的方法,但是有缺陷,只能一问一答
public static void test3() {
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(8888);
Socket socket=serverSocket.accept();
// 简单一点,将is流直接传入到Scanner里面,服务端的输入
Scanner severScanner=new Scanner(System.in);
// 客户端的outputStream
PrintWriter socketPrint=new PrintWriter(socket.getOutputStream());
// 客户端的inputStream
Scanner socketScanner=new Scanner(socket.getInputStream());
while(severScanner.hasNextLine()){
// 服务端向客户端输出消息
socketPrint.println(severScanner.nextLine());
socketPrint.flush();
// 如果
if(socketScanner.hasNextLine()){
System.out.println(socketScanner.nextLine());
}
}
//
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
测试的结果
- 最后实现客户端向服务端传送命令,从服务端获取文件的内容,在传输到客户端
public static void test5() {
try {
ServerSocket serverSocket=new ServerSocket(8888 );
Socket socket=serverSocket.accept();
// 客户端的输入流
Scanner socketScanner=new Scanner(socket.getInputStream());
// 服务端的输入流
Scanner serverScanner=new Scanner(System.in);
// 客户端的输出流
PrintWriter socketPrintWrite=new PrintWriter(socket.getOutputStream());
while(socketScanner.hasNextLine()){
String FileName=socketScanner.nextLine();
Scanner file=getFile(FileName);
while(file.hasNextLine()){
String str=file.nextLine();
socketPrintWrite.println(str);
socketPrintWrite.flush();
}
file.close();
}
socketScanner.close();
serverScanner.close();
socketPrintWrite.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//这个方法是获取文件的内容
public static Scanner getFile(String FileName) {
Scanner scanner = null;
try {
scanner=new Scanner( new FileInputStream(FileName));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(scanner!=null);
return scanner;
}
当我们输入C:/Users/caowa/workspace/ServiceSockt/src/com/ServiceSockt/ServiceSockt.java这条指令时,就会获取一个java文件的详细内容返回给我们