java.net.SocketException: Connection reset
有同样的帖子,也看了各位大神的回复,修改了自己的代码后,发现,还是报这个错,求解释..........客户端:
package newpackage;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client extends Thread{
Socket s;
BufferedReader br;
PrintWriter pw;
public static void main(String[] args) {
new Client();
}
public Client(){
deal();
this.start();
}
@Override
public void run(){
try{
while(true){
System.out.println("注册的命令<register@name=用户名/>");
System.out.println("登陆的命令<login@name=用户名/>");
System.out.println("发送信息的命令<message@from=用户名@to=用户名@message=message>");
System.out.println("注销的命令<logout@name=用户名/> ");
System.out.println("退出的命令 exit ");
String mes1=writea();
if(mes1.equals("exit")){
pw.close();
br.close();
s.close();
break;
}else if(mes1.equals("1")){
String getmess=br.readLine();
System.out.println(getmess);
}
pw.println(mes1);
pw.flush();
System.out.println(mes1);
String getmess=br.readLine();
System.out.println(getmess);
}
}catch(Exception e){
e.printStackTrace();
}
}
public void deal(){
int port=8882;
String id="127.0.0.1";
try{
s=new Socket(id,port);
InputStreamReader reader=new InputStreamReader(s.getInputStream());
br=new BufferedReader(reader);
pw=new PrintWriter(s.getOutputStream());
}catch(Exception e){
e.printStackTrace();
}
}
public String writea(){
System.out.println("请输入你的命令");
Scanner sc=new Scanner(System.in);
String mes1=sc.next();
return mes1;
}
}
服务端:
package newpackage;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
public class Server {
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(8882);
// boolean isLogin = false,state = false;
// List<String>l=new ArrayList<String>();
// HashMap<Integer,String> hm=new HashMap<Integer,String>();
while(true){
Socket socket=server.accept();
System.out.println("hello");
SocketHandle handle=new SocketHandle(socket);
Thread thread=new Thread(handle);
thread.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package newpackage;
import ch3.*;
import java.io.*;
import java.net.Socket;
import java.util.*;
public class SocketHandle implements Runnable {
static boolean isLogin,state;
static List<String>l=new ArrayList<String>();
static HashMap cl=new HashMap();
private Socket socket;
// HashMap<Integer,String> hm;
public SocketHandle( Socket socket){
this.socket=socket;
}
public void writera(PrintWriter pw,String getmess)throws Exception{
if(getmess.contains("register")){
int t=getmess.indexOf("=");
String getm=getmess.substring(t+1,getmess.length()-2);
if(l.contains(getm)){
pw.println("<result command=”register” state=”error” message=”” />");
pw.flush();
}else{
l.add(getm);
System.out.println(getm);
pw.println(" <result command=”register” state=”ok” />");
pw.flush();
}
}else if(getmess.contains("login")){
System.out.println("login");
int t=getmess.indexOf("=");
String getm=getmess.substring(t+1,getmess.length()-2);
System.out.println(getm+"dfdfdfddfdf"+getm.equals(l.get(0)));
if(!state&&isOr(getm)){
pw.println("<result command=” login ” state=”ok” />");
pw.flush();
isLogin=true;
try{
cl.put(getm, socket);
}catch(Exception e){
e.printStackTrace();
}
}
else {
pw.println("<result command=”login” state=”error” message=”” />;");
pw.flush();
}
}else if(getmess.contains("message")){
if(isLogin){
int i1=getmess.indexOf("to");
int i2=getmess.lastIndexOf("@");
String str=getmess.substring(i1+3, i2);
System.out.println("hhhhhhhhhh"+str);
if(cl.containsKey(str)){
pw.println("<result command=” message ” state=”ok” />;");
pw.flush();
sendmessage(str,getmess);
}else{
pw.println("你要发送的用户没有注册");
pw.flush();
}
// hm.put(socket.getPort(), getmess);
}else{
pw.println("请登录。。。。。。");
pw.flush();
}
}else if(getmess.contains("logout")){
if(!state){
int t=getmess.indexOf("=");
String getm=getmess.substring(t+1,getmess.length()-2);
pw.println("<result command=” logout ” state=”ok” />");
pw.flush();
l.remove(getm);
}
else {
pw.println("<result command=”loginout” state=”error” message=”” />");
pw.flush();
}
}else{
pw.println("输入信息有误");
pw.flush();
}
}
public boolean isOr(String mess){
for(int j=0;j<l.size();j++){
if(mess.equals(l.get(j)))return true;
}
return false;
}
@Override
public void run() {
try{
System.out.println("hello");
InputStreamReader reader=new InputStreamReader(socket.getInputStream());
BufferedReader br=new BufferedReader(reader);
String getmess=br.readLine();
System.out.println(getmess+"helloa");
System.out.println(socket.getPort()+"aaahelloa");
PrintWriter pw=new PrintWriter(socket.getOutputStream());
writera(pw,getmess);
// pw.println("wawa");
// pw.flush();
socket.shutdownInput();
// socket.shutdownOutput();
// pw.close();
// br.close();
// socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
private void sendmessage(String name ,String mess)throws Exception {
Socket dos=(Socket)cl.get(name);
PrintWriter pw=new PrintWriter(dos.getOutputStream());
pw.println(mess);
pw.flush();
System.out.println("怎么了,");
System.out.println(cl.size());
pw.close();
dos.close();
}
}
----------------解决方案--------------------------------------------------------
主要是,客户端报这个错............求指点。
----------------解决方案--------------------------------------------------------
,求指点...
----------------解决方案--------------------------------------------------------
就是,我想让客户端,一直能不断地输入,然后服务器端根据输入的信息进行判断.....
怎么能让客户端不断地输入?
服务器端,应该没问题,不用多看,直接看客户端就行...
----------------解决方案--------------------------------------------------------
试了一个服务器端不存在的命令,得到一个Software caused connection abort: recv failed
问题在于 客户端采用while(true)循环发命令 但你的服务器端只接收一次,接收完之后立刻调用socket.shutdownInput(); 关闭了输入流
----------------解决方案--------------------------------------------------------
回复 5楼 shellingford
呵呵,已经搞好了,谢谢哈。客户端需要再起一个线程用来接受服务器端发送过来的消息,然后服务器端的流都不能关闭,就可以了 ----------------解决方案--------------------------------------------------------