TCP 双工问题

YinWenXin00 2012-07-10 10:20:36
我也不清楚是不是TCP双工造成的问题,情况是这样的:

1.客户端启动两个线程(相差很短时间间隔)向服务器申请下载文件。
2.服务器读取了第一个线程的请求,发送文件。
3.服务器响应完第一个线程的请求后,读取不到第二个线程发来请求的信息。
我想知道,第二个线程发来的数据发送到哪里去了?服务器接收到了没有,如果接收到了怎么才能读取出来,多谢~
...全文
347 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
杀手 2012-07-13
  • 打赏
  • 举报
回复
在线程结束后
Xserv.socketWriteLock.unlock();

lliiqiang 2012-07-13
  • 打赏
  • 举报
回复
当然是要用两个socket了,不然两个文件就合在一起了
杀手 2012-07-12
  • 打赏
  • 举报
回复
数据还在,只是锁导致不能显示
YinWenXin00 2012-07-12
  • 打赏
  • 举报
回复
up一个,难道数据被冲掉了?
java_augur 2012-07-12
  • 打赏
  • 举报
回复
不是要加close语句么?
杀手 2012-07-12
  • 打赏
  • 举报
回复
13楼我不是回复你了吗
YinWenXin00 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

数据还在,只是锁导致不能显示
[/Quote]

我觉得也是锁的问题,怎么修改呢?
YinWenXin00 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

你是不是没有监听啊 只有监听一次
ServerSocket ss = new ServerSocket(serverPort);
s = ss.accept();
多用户一般要循环监听的 while(true){
s = ss.accept();}不知道对不 你改改试试
[/Quote]

为了简化,我只监听了一个用户,该用户启用多个线程请求
书断华 2012-07-11
  • 打赏
  • 举报
回复
你是不是没有监听啊 只有监听一次
ServerSocket ss = new ServerSocket(serverPort);
s = ss.accept();
多用户一般要循环监听的 while(true){
s = ss.accept();}不知道对不 你改改试试
YinWenXin00 2012-07-11
  • 打赏
  • 举报
回复
Client:
public class XCli
{
private static int bufSize = 32;
private static byte[] buff = new byte[bufSize];
private static FileInputStream fis;
private static ObjectInputStream ois;
private static BufferedOutputStream bos;
private static BufferedInputStream bis;
private static Socket s;

public static void main(String[] args)
{
try
{
s = new Socket("127.0.0.1",20003);
bis =new BufferedInputStream(s.getInputStream());
bos = new BufferedOutputStream(s.getOutputStream());
int s2cType;

while((s2cType = bis.read())!=-1) //问题出在这里吗?第一个线程的请求接收到了,第二个线程的请求就没有接收到
{
if(s2cType == 1)
{
ois = new ObjectInputStream(s.getInputStream());
String name = (String)ois.readObject();
bos = new BufferedOutputStream(s.getOutputStream());
bos.write(1);
bos.flush();
sendFile(name);
}
}

}
catch(Exception e)
{
e.printStackTrace();
}
}
}



服务器主线程:
public class Xserv {
private static String savepath = "C:\\hello.txt";
private static int bufSize = 32;
private static byte[] buff = new byte[bufSize];
private static final int serverPort = 20003;
private static Socket s;
private static FileOutputStream fos;
private static BufferedInputStream bis;
public static final ReentrantLock socketWriteLock = new ReentrantLock();
public static RequestThread t1;
public static RequestThread t2;
public static Object obj = new Object();

public static void main(String[] args)
{
try
{
ServerSocket ss = new ServerSocket(serverPort);
s = ss.accept();


t1 = new RequestThread(s,"C:\\Codes\\test.java");
t1.start();
t2 = new RequestThread(s,"C:\\Codes\\test2.java");
t2.start();
bis = new BufferedInputStream(s.getInputStream());
int type = 0;

while((type = bis.read())!=-1)
{
System.out.println(type);
if(type == 1)
resvFile();
}
}
catch(Exception ioe)
{
ioe.printStackTrace();
System.out.println("bis出错");
}
}
}


服务器请求线程:
class RequestThread extends Thread
{
private String name;
Socket s;
RequestThread(Socket so,String n)
{
s = so;
name = n;
}

public void run()
{
System.out.println("here");
Xserv.socketWriteLock.lock();
try
{
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
bos.write(1);
bos.flush();
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(name);
oos.flush();
}
catch(Exception e)
{

}

System.out.println("请求线程结束");
System.out.println(Xserv.socketWriteLock.getHoldCount());
}
}


可能与上文说的有点出入,请大神帮忙指点,急
书断华 2012-07-11
  • 打赏
  • 举报
回复
你把run方法拿出来看看 估计大神路过就帮你解决了(服务器客户端都给给)
YinWenXin00 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

while(true){
Socket socket = serverSocket.accept();
启动线程进行下载是这样的吗?



}
[/Quote]
服务器端:
while(true){
Socket socket = serverSocket.accept();
启动服务线程之后再次监听客户端连接。

}

服务器端服务线程:
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream);
int orderType;
while(ture)
{
orderType = bis.read();

if(orderType == DOWNLOAD)
{

}
}

书断华 2012-07-11
  • 打赏
  • 举报
回复
while(true){
Socket socket = serverSocket.accept();
启动线程进行下载是这样的吗?



}
YinWenXin00 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

服务器是否一直在监听?还是运行一次就完不跑了?(新手说的不好谅解下)
[/Quote]可能我说的不清楚,抱歉。服务器对于每一个用户单独启用一个线程用来服务,我采用的是自制协议的方式交流,服务器的模型为
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream);
int orderType;
while(ture)
{
orderType = bis.read();

if(orderType == DOWNLOAD)
{

}
}
ldq67123 2012-07-11
  • 打赏
  • 举报
回复
不知道你请求下载文件的数据包是怎么组织的,或许是你服务器一次性就吧两次请求的数据包读出来了,但只识别了第一个,丢弃了第二个;或许服务器的第二次读因某种原因导致io阻塞,出现读取不到的假象
书断华 2012-07-11
  • 打赏
  • 举报
回复
服务器是否一直在监听?还是运行一次就完不跑了?(新手说的不好谅解下)
YinWenXin00 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

同一socket?不同socket?
[/Quote]用的同一个socket
杀手 2012-07-11
  • 打赏
  • 举报
回复
是你的锁没有释放

System.out.println("请求线程" + this + "结束");

System.out.println(Xserv.socketWriteLock.getHoldCount());

Xserv.socketWriteLock.unlock();


你试试看行不行
ldq67123 2012-07-10
  • 打赏
  • 举报
回复
同一socket?不同socket?

62,621

社区成员

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

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