(使用IDEA)
按照菜鸟教程连接客户端和服务端时 菜鸟教程,简单的客户端与服务端连接demo(https://www.runoob.com/java/java-networking.html)遇到了一些问题:
1、先在新建立的java项目里建立Client和Server两个java文件。
(两个class后缀的文件是编译后才出现的)
2、写代码
Client.java
import java.net.*; import java.io.*; public class Client { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("连接到主机:" + serverName + ",端口号:" + port); Socket client = new Socket(serverName, port); System.out.println("远程主机地址:" + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("服务器响应: " + in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } }
Server.java
import java.net.*; import java.io.*; public class Server extends Thread { private ServerSocket serverSocket; public Server(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("远程主机地址:" + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("谢谢链接我:" + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; }catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new Server(port); t.run(); }catch(IOException e) { e.printStackTrace(); } } }
3、用cmd进行编译(快捷键 win+R)
(1)Server.java 执行以下两个命令启动服务
javac Server.java
java Server 6066
补充基础:javac 和 java
javac命令是将源代码编程成class字节码文件,因为我们的JVM虚拟机是执行class字节码文件的,不是执行源代码,JVM虚拟机是不认识源代码的。
使用java命令来执行class字节码文件
这时候注意一下自己的Server.java文件存在了哪里,我是存在d盘,所以先输入 d: 打开d盘目录,然后 cd 打开所在文件夹,
此时运行javac Server.java 遇到错误:
1】解决 java “错误:编码GBK 的不可映射字符”
此处解决方式:用UTF-8编码,即命令改为javac -encoding UTF-8 Server.java
参考博客:解决 java “错误:编码GBK 的不可映射字符”
(2)Client.java 执行以下两个命令启动服务
javac Client.java
java Client localhost 6066
这里遇到问题:
2】解决java错误:java.net.ConnectException: Connection refused: connect
此处解决方式:
原因分析:Server.java 等了太久,已经Socket timed out! 了。
所以就,速度快一点,两个文件的第二个命令运行完Client就赶紧Server脚前脚后,这个连接很容易就断掉了。(下图就是Server客户端等待时间过长导致Socket timed out! )
这部分的这么写:
4、最后结果是这样的:
Server.java界面
等待远程连接,端口号为:6066…
Client.java界面
连接到主机:localhost ,端口号:6066
远程主机地址:localhost/127.0.0.1:6066
服务器响应: 谢谢连接我:/127.0.0.1:6066
Goodbye!