我也不清楚是不是TCP双工造成的问题,情况是这样的:
1.客户端启动两个线程(相差很短时间间隔)向服务器申请下载文件。
2.服务器读取了第一个线程的请求,发送文件。
3.服务器响应完第一个线程的请求后,读取不到第二个线程发来请求的信息。
我想知道,第二个线程发来的数据发送到哪里去了?服务器接收到了没有,如果接收到了怎么才能读取出来,多谢~
1.客户端启动两个线程(相差很短时间间隔)向服务器申请下载文件。
2.服务器读取了第一个线程的请求,发送文件。
3.服务器响应完第一个线程的请求后,读取不到第二个线程发来请求的信息。
我想知道,第二个线程发来的数据发送到哪里去了?服务器接收到了没有,如果接收到了怎么才能读取出来,多谢~
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream);
int orderType;
while(ture)
{
orderType = bis.read();
if(orderType == DOWNLOAD)
{ }
}
Socket socket = serverSocket.accept();
启动线程进行下载是这样的吗?
}
while(true){
Socket socket = serverSocket.accept();
启动服务线程之后再次监听客户端连接。
}服务器端服务线程:
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream);
int orderType;
while(ture)
{
orderType = bis.read();
if(orderType == DOWNLOAD)
{ }
}
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());
}
}
可能与上文说的有点出入,请大神帮忙指点,急
ServerSocket ss = new ServerSocket(serverPort);
s = ss.accept();
多用户一般要循环监听的 while(true){
s = ss.accept();}不知道对不 你改改试试
System.out.println(Xserv.socketWriteLock.getHoldCount());
Xserv.socketWriteLock.unlock();
你试试看行不行
Xserv.socketWriteLock.unlock();