程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> socket-關於java的Socket的一個問題

socket-關於java的Socket的一個問題

編輯:編程綜合問答
關於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循環那裡;
主要想問一下為什麼會報這樣的錯,改進可以不要,
但是如果我用浏覽器訪問這個服務器,卻不會報錯,這是為什麼呢,
這裡主要問一下為什麼會出這樣的錯,改進可以不要。

最佳回答:


在你的這段代碼裡,犯了兩個錯誤

  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而不是空字符串。

希望你在編程的時候,養成資源釋放的好習慣

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved