服务器
public class Server {
class ServerHelper implements Runnable
{
InputStream is;
private InputStreamReader isr;
private BufferedReader br;
public ServerHelper(InputStream is) {
this.is = is;
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
}
private void display() throws IOException {
String s = "";
System.out.print("client says : ");
while ( ( s = br.readLine() ) != null ) {
System.out.print(s + " ");
}
}
@Override
public void run() {
try {
display( );
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
void start( ) throws Exception{
ServerSocket ss = new ServerSocket(5555);
while (true) {
System.out.println("waiting for conn..");
Socket accept = ss.accept();//code hangs over here and doesn't proceed ahead
if( accept == null )
System.out.println("got null...");
System.out.println("got the client req...");
ServerHelper sh = new ServerHelper(accept.getInputStream());
Thread t = new Thread(sh);
t.start();
}
}
public static void main(String[] args) {
try {
// TODO code application logic here
new Server().start();
} catch (Exception ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
客户
public class Client {
void start( ) throws Exception{
System.out.println("enter window size ");
Scanner sc = new Scanner(System.in);
int wsize = sc.nextInt();
Socket s = new Socket("127.0.0.1", 5555);
System.out.println("is connected .." + s.isConnected());
OutputStream outputStream = s.getOutputStream();
PrintWriter pw = new PrintWriter(outputStream);
String c = "y";
int j = 0;
do{
String se = "";
for (int i = 0; i < wsize; i++) {
j++;
se = se + String.valueOf(j);
}
pw.println(se);
pw.flush();
System.out.println("do u wanna send more....?(y|n)");
c = sc.next();
}while( c.equalsIgnoreCase("y") );
}
public static void main(String[] args) {
try {
// TODO code application logic here
new Client().start();
} catch (Exception ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Socket accept = ss.accept();
这里我的代码挂起我知道它阻止了io,但在客户端我确实验证了客户端是否已连接但是它显示已连接...是什么问题与accept()?我以类似的方式为我的所有TCP应用程序编码,但这很奇怪..可以任何一个帮助
我还为那些想要查看该课程的人添加了ServerHelper代码..
答案 0 :(得分:0)
查看您的代码:
while (true) {
System.out.println("waiting for conn..");
Socket accept = ss.accept();
.................
}
您将ss.accept()
调入无限循环。连接客户端accept()
后,将返回Socket
个实例。然后将此套接字传递给在其自己的线程中运行的服务器帮助程序并返回到ss.accept()
,这样您的服务器就可以接受其他客户端了。你的代码看起来不错。很遗憾,您还没有发送ServerHelper
的代码,也没有解释您的客户端是否成功将数据发送到服务器,但到目前为止一切看起来还不错。
答案 1 :(得分:0)
如果对accept
的调用确实是阻塞,那么你有另一个运行的程序正在侦听5555并且绑定到“127.0.0.1”。您的客户端正在连接到其他程序,因此ss.accept仍会阻止。
解决方案是查找并终止其他进程
其他信息:
由于您未在服务器套接字中指定绑定地址,因此它绑定到“0.0.0.0”(所有接口)。
可以将一个进程绑定到127.0.01,将另一个进程绑定到0.0.0.0(至少在Windows上)。我从tcpview复制了一些数据。第二列是进程ID。
java.exe 5944 TCP 0.0.0.0 5555 0.0.0.0 0 LISTENING
java.exe 5944 TCPV6 [0:0:0:0:0:0:0:0] 5555 [0:0:0:0:0:0:0:0] 0 LISTENING
java.exe 5608 TCP 127.0.0.1 5555 0.0.0.0 0 LISTENING
我可以使用telnet 10.101.16.28 5555
(我的本地IP地址)连接到流程5944,或使用telnet 127.0.0.1 5555
连接到流程5608
答案 2 :(得分:0)
当然它阻止了。它正在等待连接。这就是应该做的。 BTW检查accept()的结果为null是没有意义的。它不会为空。可能这是你的错误观念:如果没有传入连接,你是否期望它返回null?它没有这样做。见Javadoc。