WANGYANG000001 2016-01-10 05:00 采纳率: 50%
浏览 1444
已采纳

关于java的Socket的一个问题

服务端

package 手写服务器一;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//////////////////
public class Server {
private ServerSocket server;

public static void main(String[] args) {
    Server s=new Server();
    s.start();
}
//创建客户端
private void start(){
    try {
        server=new ServerSocket(9999);
        this.receive();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
//接收数据
private void receive(){
    try {
        Socket socket=server.accept();
        StringBuilder msg=new StringBuilder();
        String str=null;
        BufferedReader reader=new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        while((str=reader.readLine()).length()>0)
        {
            msg.append(str);
            msg.append("\r\n");
        }
        System.out.println(msg.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

客户端
package 客户端;
///////////
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
////////////
public class Client {
public static void main(String[] args) throws IOException{
@SuppressWarnings("resource")
Socket socket=new Socket(InetAddress.getLocalHost(),9999);
BufferedWriter writer=new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
writer.write("我是");
writer.newLine();
writer.flush();
}
}
//////////
错误为:java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at 手写服务器一.Server.receive(Server.java:34)
at 手写服务器一.Server.start(Server.java:20)
at 手写服务器一.Server.main(Server.java:14)
///////////////
客户端访问会报上面的错误,错误在服务端的接收数据的while循环那里;
主要想问一下为什么会报这样的错,改进可以不要,
但是如果我用浏览器访问这个服务器,却不会报错,这是为什么呢,
这里主要问一下为什么会出这样的错,改进可以不要。

  • 写回答

3条回答 默认 最新

  • _rdOfJava 2016-01-10 05:33
    关注

    在你的这段代码里,犯了两个错误

    1. 在客户端编码中,你没有关闭输出流和socket 你所得到的java.net.SocketException: Connection reset也是因为客户端退出时,没有关闭连接引起的。 建议修改 public class Client { public static void main(String[] args) throws IOException{ Socket socket=new Socket(InetAddress.getLocalHost(),9999); BufferedWriter writer=new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); writer.write("我是"); writer.flush(); writer.close(); socket.close(); } }
    2. 在服务端代码中,while的条件写错 错误代码: BufferedReader reader=new BufferedReader( new InputStreamReader(socket.getInputStream())); while((str=reader.readLine()).length()>0) { msg.append(str); msg.append("\r\n"); } 建议将while的循环条件改为: BufferedReader reader=new BufferedReader( new InputStreamReader(socket.getInputStream())); while((str=reader.readLine()) != null) { msg.append(str); msg.append("\r\n"); } 在readLine方法中,若无内容返回null而不是空字符串。

    希望你在编程的时候,养成资源释放的好习惯

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)