socket网络编程中服务器与客户端通信失败的问题

服务器代码如下

public class server {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(5678);
        Socket socket=server.accept();
        InputStream is=socket.getInputStream();
        OutputStream os=socket.getOutputStream();
        Scanner input=new Scanner(is);
        PrintWriter out=new PrintWriter(os,true);
        out.print("链接服务器成功");
        out.print("end");
        String sr;
        while (true) {
            sr=input.nextLine();
            if (sr.equals("end")) {
                break;
            }
            System.out.println(" 客户端说"+sr);
        }
        socket.close();
    }
}

客户端代码如下

public class Clint {
    public static void main(String[] args) throws UnknownHostException, IOException {
        // TODO 自动生成的方法存根
        Socket socket=new Socket(InetAddress.getLocalHost(), 5678);
        InputStream is=socket.getInputStream();
        OutputStream os=socket.getOutputStream();
        Scanner in=new Scanner(is);
        PrintWriter out=new PrintWriter(os,true);
        String sr,sw;
        while (true) {
            sr=in.nextLine();
            System.out.println("服务器说 "+sr);
            if (sr.equals("end")) {
                break;
            }
        }
        Scanner input=new Scanner(System.in);
        while (true) {
            System.out.print(" 客戶端說");
            sw=input.next();
            out.println(sw);
            if (sw.equals("end")) {
                break;
            }

        }
        socket.close();
    }
}

最初客户端一直无法读取到服务器返回的消息,后来发现是在服务器如下两行代码的问题

        out.print("链接服务器成功");
        out.print("end");

应该修改为如下代码

        out.println("链接服务器成功");
        out.println("end");

print的源码如下

    public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
    }

而println的源码如下

    public void println(String x) {
        synchronized (lock) {
            print(x);
            println();
        }
    }

而在println(String x)中又调用了println()方法

public void println() {
        newLine();
    }

其中调用了newLine()方法
源码如下

private void newLine() {
        try {
            synchronized (lock) {
                ensureOpen();
                out.write(lineSeparator);
                if (autoFlush)
                    out.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

可以看出println()方法中多了一个out.write(lineSeparator);
添加了一个分隔符,并且可以设置自动flush
因为默认的autoFlush=false,可以在创建PrintWriter时设置为true。

PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);

有如下代码

inReader.readLine()

可看出readLine()是一行一行读取数据,而标识一行的方式就是使用分隔符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Socket编程是一种网络编程技术,它可以实现客户端服务器之间的通信。在Socket编程客户端服务器通过套接字(Socket)建立连接,然后通过Socket发送和接收数据。 客户端服务器之间的通信可以分为两种方式:TCP和UDP。TCP是一种可靠的连接协议,它可以保证数据的可靠传输,但是速度较慢。UDP是一种不可靠的连接协议,它可以快速传输数据,但是数据的可靠性不如TCP。 在Socket编程客户端服务器需要分别创建一个Socket对象,然后通过Socket对象建立连接。客户端通过Socket对象向服务器发送数据,服务器通过Socket对象接收数据,并且可以向客户端发送数据。 Socket编程需要掌握网络编程的基础知识,包括IP地址、端口号、协议等。同时,还需要了解Socket编程的相关API,如socket()、bind()、listen()、accept()、connect()、send()、recv()等函数。 Socket编程可以应用于各种网络应用程序,如Web服务器、邮件服务器、聊天程序等。它是网络编程的重要技术之一,对于网络程序员来说,掌握Socket编程是必不可少的。 ### 回答2: Socket编程是一种在计算机网络实现进程间通信的常用方式,可以用来实现客户端服务器之间的通信。实现Socket通信的核心在于建立连接,通过连接实现数据的发送和接收。下面,我们将从以下几个方面来说明Socket编程实现客户端服务器通信的过程: 一、建立连接 客户端服务器之间的连接可以采用TCP或UDP协议来建立。当采用TCP协议时,需要先建立三次握手,确保连接的可靠性,这会消耗一定的时间。而采用UDP协议则不需要建立连接,可以直接发送数据包,但是由于UDP协议不具备可靠性,可能会导致数据丢失或失序。 二、数据发送 在建立连接之后,客户端服务器之间可以进行数据的发送和接收。客户端在发送数据时,需要先创建一个套接字,调用send()函数发送数据。服务器端在接收数据时,则需要先创建一个套接字,调用recv()函数接收数据。在数据发送时,可以选择发送数据的大小,也可以选择分包发送。 三、数据接收 当客户端发送数据之后,服务器端会接收到数据。服务器端需要先创建一个套接字,然后监听并接收客户端发送的数据。在接收数据时,服务器端也可以选择一次性接收全部数据,也可以选择分批次接收数据。 通过以上步骤,就可以实现客户端服务器之间的通信。在实际应用,还需要考虑多线程和多进程的应用,以提高系统的并发性能。同时,还需要加入安全措施,防止黑客攻击。总之,Socket编程是网络编程的基础,掌握Socket编程的方法和技巧,可以更好地实现客户端服务器之间的通信。 ### 回答3: Socket编程是一种基于网络通信的编程技术,其主要目的是实现客户端服务器之间的通信。在Socket编程客户端服务器之间通过Socket通信协议建立连接,进行数据传输和通信Socket编程实现客户端服务器通信的过程,通常包括以下几个步骤: 1. 创建Socket对象:客户端服务器都需要创建Socket对象来进行通信客户端使用Socket对象来连接服务器服务器使用Socket对象来监听客户端请求并返回数据。 2. 连接服务器客户端通过Socket对象连接服务器,可以指定服务器的IP地址和端口号。服务器通过监听客户端请求,接收客户端请求信息。 3. 发送消息:客户端创建输出流,向服务器发送消息。服务器通过读取客户端发送的消息,处理请求,并返回响应数据。 4. 接收消息:服务器创建输入流,读取客户端发送的数据并处理请求。服务器通过输出流向客户端返回响应数据。 5. 关闭Socket连接:当通信结束时,客户端服务器均需关闭Socket连接。 Socket编程的实现方式多种多样,可以使用不同的编程语言和工具进行开发。例如,Java语言可以使用Java Socket API实现Socket编程,C++可以使用Winsock或Socket类库实现Socket编程,Python可以使用socket模块实现Socket编程等。 在实际应用Socket编程广泛应用于各种网络应用场景,如Web服务器、FTP服务器、邮件服务器等。通过Socket编程,可以实现高效、可靠的网络通信,为各种应用提供了强有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值