烦扰的问题,在用Socket时,老是出现Connection reset异常问题.不晓得,如何修改程序才好。请高手们指教一下.代码如下:
服务端:
import java.net.*;
import java.io.*;
public class MulServer {
public int listenPort = 3000;
public MulServer() {
}public void acceptConnections() {
try {
ServerSocket server = new ServerSocket(listenPort, 5);
Socket incomingConnection = null;
while (true) {
incomingConnection = server.accept();
handleConnection(incomingConnection);
}
} catch (BindException e) {
System.out.println("Unable to bind to port " + listenPort);
} catch (IOException e) {
System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
}
}
public void handleConnection(Socket connectionToHandle) {
new Thread(new ConnectionHandler(connectionToHandle)).start();
}
public static void main(String[] args) {
MulServer server = new MulServer();
server.acceptConnections();
}class ConnectionHandler implements Runnable{
Socket socketToHandle;
public ConnectionHandler(Socket aSocketToHandle) {
socketToHandle = aSocketToHandle;
}
public void run() {
try {
PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());
BufferedReader streamReader =
new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));
String fileToRead = streamReader.readLine();
BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));
String line = null;
while ((line = fileReader.readLine()) != null)
streamWriter.println(line);
fileReader.close();
streamWriter.close();
streamReader.close();
} catch (Exception e) {
System.out.println("Error handling a client: " + e);
}
}
}
}客户端
import java.net.*;
import java.io.*;
public class Client extends Thread {
Socket so;
public Client() throws Exception{
so = new Socket("127.0.0.1",3000);
}
public void sendMsg(String str) throws Exception{
PrintWriter pw = new PrintWriter(so.getOutputStream());
pw.print(str);
}
public void run(){
try{
this.sendMsg("tests.test");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String arg[]){
try{
Client[] c = new Client[5];
for (int i=0; i<5; i++){
c[i] = new Client();
c[i].start();
}
}catch(Exception e){
e.printStackTrace();
}
}}
服务端:
import java.net.*;
import java.io.*;
public class MulServer {
public int listenPort = 3000;
public MulServer() {
}public void acceptConnections() {
try {
ServerSocket server = new ServerSocket(listenPort, 5);
Socket incomingConnection = null;
while (true) {
incomingConnection = server.accept();
handleConnection(incomingConnection);
}
} catch (BindException e) {
System.out.println("Unable to bind to port " + listenPort);
} catch (IOException e) {
System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
}
}
public void handleConnection(Socket connectionToHandle) {
new Thread(new ConnectionHandler(connectionToHandle)).start();
}
public static void main(String[] args) {
MulServer server = new MulServer();
server.acceptConnections();
}class ConnectionHandler implements Runnable{
Socket socketToHandle;
public ConnectionHandler(Socket aSocketToHandle) {
socketToHandle = aSocketToHandle;
}
public void run() {
try {
PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());
BufferedReader streamReader =
new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));
String fileToRead = streamReader.readLine();
BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));
String line = null;
while ((line = fileReader.readLine()) != null)
streamWriter.println(line);
fileReader.close();
streamWriter.close();
streamReader.close();
} catch (Exception e) {
System.out.println("Error handling a client: " + e);
}
}
}
}客户端
import java.net.*;
import java.io.*;
public class Client extends Thread {
Socket so;
public Client() throws Exception{
so = new Socket("127.0.0.1",3000);
}
public void sendMsg(String str) throws Exception{
PrintWriter pw = new PrintWriter(so.getOutputStream());
pw.print(str);
}
public void run(){
try{
this.sendMsg("tests.test");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String arg[]){
try{
Client[] c = new Client[5];
for (int i=0; i<5; i++){
c[i] = new Client();
c[i].start();
}
}catch(Exception e){
e.printStackTrace();
}
}}
改成 pw.println(str);
还是先只实现发送消息,而不返回消息的功能。
服务端:
import java.net.*;
import java.io.*;public class Server {
public ServerSocket ss;
int pools;
public Server(int port , int pools) throws Exception{
ss= new ServerSocket(port, pools);
this.pools = pools;
System.out.println(port+" "+pools);
}
public void acceptConnet() throws Exception{
while(true){
Socket s = ss.accept();
if(s!=null){
System.out.println("have set thread " + pools);
(new ServerThread(s, pools)).start();
--pools;
}
}
} public static void main(String arg[]){
try{
Server server = new Server(3000, 5);
server.acceptConnet();
}catch(Exception e){
e.printStackTrace();
}
} class ServerThread extends Thread{
private Socket so;
private int numb;
public ServerThread(Socket so, int num) {
this.so=so;
numb = num;
} public void setSo(Socket so){
this.so=so;
}
public void run(){
try{
BufferedReader br = new BufferedReader(new InputStreamReader(so.
getInputStream()));
PrintWriter pw = new PrintWriter(so.getOutputStream());
String line;
while (true) {
if((line=br.readLine())!=null){
System.out.println("Thread "+numb+": "+line);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}}
客户端和上面差不多,我把pw.print(str)改成了pw.println(str) pw.flush();
import java.net.*;
import java.io.*;
public class Client extends Thread {
Socket so;
public Client() throws Exception{
so = new Socket("127.0.0.1",3000);
}
public void sendMsg(String str) throws Exception{
PrintWriter pw = new PrintWriter(so.getOutputStream());
pw.println(str);
pw.flush();
}
public void run(){
try{
this.sendMsg("tests.txt");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String arg[]){
try{
Client[] c = new Client[5];
for (int i=0; i<5; i++){
c[i] = new Client();
c[i].start();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
你看又报错了。
这个方法,你先换成ServerSocket(int port)
试一下。..看下,还有那个错误不?
我看了我的代码,原来在程序结束前,都没关闭socket,所以server就报异常了。
谢谢楼上的建议.