java网络编程连接客户端和服务端小demo

2021/9/9 9:36:11

本文主要是介绍java网络编程连接客户端和服务端小demo,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

(使用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!

在这里插入图片描述



这篇关于java网络编程连接客户端和服务端小demo的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程