想用Java的Socket做一个局域网的在线聊天系统 连接一个客户端的时候没问题 到连接第二个的时候就做死的报
java.net.SocketException: Connection reset 异常。 纠结。 恳请各位大牛支援:这是客户端读的代码:
package com.newer.client;import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.List;public class ClientReader extends Thread{
private Socket sk = null;
private ObjectInputStream ois = null;
private ClientJframe client=null;
private User user = null;
public ClientReader(Socket sk, ClientJframe client){
this.sk = sk;
this.client = client;
try {
ois = new ObjectInputStream(sk.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
while(true){
try {
Object obj = ois.readObject();
if(obj==null){
continue;
}
if(obj instanceof User){
client.display(user);
continue;
}else{
List list = (List)obj;
this.client.addList(list);
continue;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}这是客户端写的代码:
package com.newer.client;import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;public class ClientWriter extends Thread {
private Socket sk = null;
private ObjectOutputStream oos = null;
private boolean flag = false;
private User user = null; public ClientWriter(User user, Socket sk) {
this.user = user;
this.sk = sk;
} public Socket getSk() {
return sk;
} public void setSk(Socket sk) {
this.sk = sk;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public boolean isFlag() {
return flag;
} public void setFlag(boolean flag, User user) {
this.flag = flag;
this.user = user;
this.notify();
}
public void run() {
try {
oos = new ObjectOutputStream(sk.getOutputStream());
oos.writeObject(user);
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是服务器的代码:
package com.newer.server;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import com.newer.client.User;public class ServerThread extends Thread {
private Socket sk = null;
private static List list = new ArrayList();
private static List listThread = Server.list;
private ObjectInputStream ois = null;
private ObjectOutputStream oos = null;
private User user = null; public ServerThread(Socket sk) {
this.sk = sk;
init();
} public void init() {
try {
ois = new ObjectInputStream(sk.getInputStream()); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void run() {
while (true) {
try {
Object obj = ois.readObject();
if(obj==null){
continue;
}
user = (User) obj;
if (user.getuName() != null && !"".equals(user.getuName())) {
list.add(user);
for (int i = 0; i < listThread.size(); i++) {
Socket s = (Socket)listThread.get(i);
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(list);
oos.flush();
}
continue;
}
String goToip = user.getGoToip();
if (goToip == null || "".equals(goToip)) {
for (int i = 0; i < listThread.size(); i++) {
Socket s = (Socket)listThread.get(i);
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(user);
oos.flush();
}
} else {
for (int i = 0; i < listThread.size(); i++) {
Socket s = (Socket)listThread.get(i);
String ip = s.getInetAddress().toString().substring(1);
if(ip.equals(goToip)){
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(user);
oos.flush();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
User类是我自己写的一个类:作为序列化传递的类;
java.net.SocketException: Connection reset 异常。 纠结。 恳请各位大牛支援:这是客户端读的代码:
package com.newer.client;import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.List;public class ClientReader extends Thread{
private Socket sk = null;
private ObjectInputStream ois = null;
private ClientJframe client=null;
private User user = null;
public ClientReader(Socket sk, ClientJframe client){
this.sk = sk;
this.client = client;
try {
ois = new ObjectInputStream(sk.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
while(true){
try {
Object obj = ois.readObject();
if(obj==null){
continue;
}
if(obj instanceof User){
client.display(user);
continue;
}else{
List list = (List)obj;
this.client.addList(list);
continue;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}这是客户端写的代码:
package com.newer.client;import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;public class ClientWriter extends Thread {
private Socket sk = null;
private ObjectOutputStream oos = null;
private boolean flag = false;
private User user = null; public ClientWriter(User user, Socket sk) {
this.user = user;
this.sk = sk;
} public Socket getSk() {
return sk;
} public void setSk(Socket sk) {
this.sk = sk;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public boolean isFlag() {
return flag;
} public void setFlag(boolean flag, User user) {
this.flag = flag;
this.user = user;
this.notify();
}
public void run() {
try {
oos = new ObjectOutputStream(sk.getOutputStream());
oos.writeObject(user);
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是服务器的代码:
package com.newer.server;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import com.newer.client.User;public class ServerThread extends Thread {
private Socket sk = null;
private static List list = new ArrayList();
private static List listThread = Server.list;
private ObjectInputStream ois = null;
private ObjectOutputStream oos = null;
private User user = null; public ServerThread(Socket sk) {
this.sk = sk;
init();
} public void init() {
try {
ois = new ObjectInputStream(sk.getInputStream()); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void run() {
while (true) {
try {
Object obj = ois.readObject();
if(obj==null){
continue;
}
user = (User) obj;
if (user.getuName() != null && !"".equals(user.getuName())) {
list.add(user);
for (int i = 0; i < listThread.size(); i++) {
Socket s = (Socket)listThread.get(i);
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(list);
oos.flush();
}
continue;
}
String goToip = user.getGoToip();
if (goToip == null || "".equals(goToip)) {
for (int i = 0; i < listThread.size(); i++) {
Socket s = (Socket)listThread.get(i);
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(user);
oos.flush();
}
} else {
for (int i = 0; i < listThread.size(); i++) {
Socket s = (Socket)listThread.get(i);
String ip = s.getInetAddress().toString().substring(1);
if(ip.equals(goToip)){
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(user);
oos.flush();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
User类是我自己写的一个类:作为序列化传递的类;
解决方案 »
- 读取Excel
- freemarker标签怎么显示的?
- Exception sending context initialized event to listener instance of class org.
- 控制打印机输出指定格式的内容和图片
- sql2005新手请问如何建立外键约束
- set map list 中哪个是不允许有重复的呢?
- spring jdbctemplate与hibernate共用一个DataSource?
- 某外企公司面试题
- EntityBean的设计基本原则是什么?请帮我看看这种需求如何设计啊?
- 欢迎讨论,j2EE的核心模式!
- jpa查询出错
- 求解怎么读出权限的角色名称?
然后发送的消息是通过序列化来传递。 用序列化的原因就是想确定用户是想私聊还是公聊。。因为序列化是一个类。就可以传递不同类型的一些参数 一开始写出去的是一个List是用来保存所有跟服务器建立连接的
客户端。 一开始客户端选择连接的时候会让你输入你一个用户名。 而List就是用来保存所有建立连接的用户名然后显示聊天框上。 基本上就是这样了。