非常奇怪的Socket管道丢失数据

xcaicaix 2009-12-29 11:53:07
最近做了一个聊天程序,遇到了非常奇怪的问题,
我运行了一个服务器,两个客户端 A,B,通过A客户端给B客户端发送消息时,竟然出现了发一条丢失一条的怪事,
更奇怪的是,A发送到服务器上时没有发生丢失,但服务器再转发给B时,就丢失了,下面是我的服务器源码。望大虾帮帮忙。
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.Hashtable;


public class MyServer extends Thread
{
//声名服务器套接字
ServerSocket serverSocket;
public static Hashtable clienttable=null;
public static int cd;

public MyServer()
{
try
{
serverSocket = new ServerSocket(1001);
}
catch(IOException e)
{
fail(e,"不能启动服务器");
}
clienttable =new Hashtable(10);
cd = 0;
System.out.println("服务器启动 . . ."); //服务器初始化成功
start(); //启动线程
}
public static void fail(Exception e,String str) //自定义异常
{
System.out.println(str + "." + e);
}
public void run() //启动线程开始
{
try //捕获异常
{
while(true) //while里就开始监听客户端数据
{
Socket client = serverSocket.accept(); //获取客户端Socket 当有数据到达时 把数据装到client里
System.out.println("链接到远程的端点地址为为:"+client.getPort());

Connection con = new Connection(client);//然后 初始化一个Connection

}
}
catch(IOException e) //如果监听有问题就 包报错
{
fail(e,"Not listening");
}
}

public static void main(String args[])//程序入口
{
//public static Hashtable clienttable =new Hashtable(10);//定义哈希表
new MyServer(); //初始化 AppServer
}
}
class Connection extends Thread
{
//声明一个客户端的套接字(PS:上面那个是服务器套接字 这个是客户端的)和 一个输入流和输出流
protected Socket netClient; //客户端的Socket
protected BufferedReader fromClient; //从客户端获得数据
//protected DataOutputStream out; //发送数据到客户端
protected int port;

public Connection(Socket client) //这里就是41行 那里初始化Connection
{
netClient = client; //把client赋值到netClient里
port = netClient.getPort();
MyServer.cd++;
MyServer.clienttable.put(MyServer.cd,netClient);
System.out.println("已经加入哈希表中。");
System.out.println("哈希重组");
System.out.println("哈希表的图:"+MyServer.clienttable.keySet());
System.out.println("哈希表:"+MyServer.clienttable.entrySet());
this.start(); //启动第二个线程
}
public void run() //启动第二个线程开始
{
try
{
fromClient = new BufferedReader(new InputStreamReader(netClient.getInputStream()));
Socket Sw =(Socket)MyServer.clienttable.get(1);
PrintWriter out = new PrintWriter(Sw.getOutputStream());

while(true)
{

String str = fromClient.readLine();
System.out.println(str.trim());
System.out.println(this.getName());

out.println(str);
out.flush();
}
}
catch(Exception e) //定义IO异常
{
System.out.println("Error in reading object" + e);
}

finally
{
try
{
netClient.close();
}
catch(IOException e)
{

}
}
}
}
我估计是服务器这边出来毛病,客户端应该没事,所以客户端代码就没发上来了,
...全文
110 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcaicaix 2009-12-31
  • 打赏
  • 举报
回复
谢谢楼上
hzhxxx 2009-12-31
  • 打赏
  • 举报
回复
建议你看看这个,应该对你网络便成有很好的帮助
http://code.google.com/p/java-nsp/
xcaicaix 2009-12-30
  • 打赏
  • 举报
回复
@cangyingzhijia@ 大哥,测试了没。
ofacop 2009-12-29
  • 打赏
  • 举报
回复
“//protected DataOutputStream out; //发送数据到客户端"?
xcaicaix 2009-12-29
  • 打赏
  • 举报
回复
@ofacop@ 是的,那是发送到客户端的流。
xcaicaix 2009-12-29
  • 打赏
  • 举报
回复
嗯,你的客户端应该是可以测试的,你的测试如何,是不是出现了我上面说到的问题了
苍蝇①号 2009-12-29
  • 打赏
  • 举报
回复
package com.test.sql;

import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.Hashtable;

public class MyServer extends Thread {
// 声名服务器套接字
ServerSocket serverSocket;
public static Hashtable clienttable = null;
public static int cd;

public MyServer() {
try {
serverSocket = new ServerSocket(1001);
} catch (IOException e) {
fail(e, "不能启动服务器");
}
clienttable = new Hashtable(10);
cd = 0;
System.out.println("服务器启动 . . ."); // 服务器初始化成功
start(); // 启动线程
}

public static void fail(Exception e, String str) // 自定义异常
{
System.out.println(str + "." + e);
}

public void run() // 启动线程开始
{
try // 捕获异常
{
while (true) // while里就开始监听客户端数据
{
Socket client = serverSocket.accept(); // 获取客户端Socket 当有数据到达时
// 把数据装到client里
System.out.println("链接到远程的端点地址为为:" + client.getPort());

Connection con = new Connection(client);// 然后 初始化一个Connection

}
} catch (IOException e) // 如果监听有问题就 包报错
{
fail(e, "Not listening");
}
}

public static void main(String args[])// 程序入口
{
// public static Hashtable clienttable =new Hashtable(10);//定义哈希表
new MyServer(); // 初始化 AppServer
}
}

class Connection extends Thread {
// 声明一个客户端的套接字(PS:上面那个是服务器套接字 这个是客户端的)和 一个输入流和输出流
protected Socket netClient; // 客户端的Socket
protected BufferedReader fromClient; // 从客户端获得数据
// protected DataOutputStream out; //发送数据到客户端
protected int port;

public Connection(Socket client) // 这里就是41行 那里初始化Connection
{
netClient = client; // 把client赋值到netClient里
port = netClient.getPort();
MyServer.cd++;
MyServer.clienttable.put(MyServer.cd, netClient);
System.out.println("已经加入哈希表中。");
System.out.println("哈希重组");
System.out.println("哈希表的图:" + MyServer.clienttable.keySet());
System.out.println("哈希表:" + MyServer.clienttable.entrySet());
this.start(); // 启动第二个线程
}

public void run() // 启动第二个线程开始
{
try {
fromClient = new BufferedReader(new InputStreamReader(netClient
.getInputStream()));
//Socket Sw = (Socket) MyServer.clienttable.get(1);
//PrintWriter out = new PrintWriter(Sw.getOutputStream());

while (true) {

String str = fromClient.readLine();
System.out.println(str.trim());
System.out.println(this.getName());

for (Object o : MyServer.clienttable.values()) {
Socket peer = (Socket) o;
PrintWriter out = new PrintWriter(peer.getOutputStream());
out.println(str);
out.flush();
}

}
} catch (Exception e) // 定义IO异常
{
System.out.println("Error in reading object" + e);
}

finally {
try {
netClient.close();
} catch (IOException e) {

}
}
}
}


下面是我测试用的client端
package com.test.sql;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {

/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket socket = new Socket("localhost", 1001);
final InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
new Thread() {
public void run() {
processIn(in);
}
}.start();
processOut(out);

}

private static void processOut(OutputStream o) {
PrintWriter out = new PrintWriter(o);
Scanner scan = new Scanner(System.in);
while (true) {
String line = scan.nextLine();
out.println(line);
out.flush();
}

}

private static void processIn(InputStream in) {
Scanner scan = new Scanner(in);
while (true) {
System.out.println(scan.nextLine());
}

}

}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧