当前位置:编程学习 > JAVA >>

TCP 问题求解答

分别运行TCP服务器和TCP客户端,就是互相连不上;希望大神解答
这是服务器端:
public class ServerDemo implements Runnable {

@Override
public void run() {
ServerSocket ss = null;
Socket s = null;
BufferedReader br = null;
BufferedWriter bw = null;

try {
ss = new ServerSocket(10000);
s = ss.accept();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
while (true) {
System.out.println("server start!");
bw.write("Server Test!");
bw.flush();
for(String temp=null;(temp = br.readLine()) != null;){
System.out.println(temp);
}

}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


这是客户端:
public class ClientDemo implements Runnable {
Socket s;
BufferedReader br;
BufferedReader br2;
BufferedWriter bw;

@Override
public void run() {

try {
s = new Socket();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

while (true) {
System.out.println("client start!");
System.out.println(br.readLine());
bw.write("Client Test");
bw.flush();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}



多线程启动部分:
public class Main {

public static void main(String[] args) {
new Thread(new ClientDemo()).start();
new Thread(new ServerDemo()).start();
}
}
--------------------编程问答-------------------- 客户端代码
new Socket();
->new Socket("localhost", 10000);
你没有指定服务器地址和端口号 --------------------编程问答-------------------- 我复制上来的时候打少("我的IP",10000)了,补上之后还是一直没链上 --------------------编程问答--------------------
引用 楼主 u011790240 的回复:
分别运行TCP服务器和TCP客户端,就是互相连不上;希望大神解答
这是服务器端:
public class ServerDemo implements Runnable {

@Override
public void run() {
ServerSocket ss = null;
Socket s = null;
BufferedReader br = null;
BufferedWriter bw = null;

try {
ss = new ServerSocket(10000);
s = ss.accept();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
while (true) {
System.out.println("server start!");
bw.write("Server Test!");
bw.flush();
for(String temp=null;(temp = br.readLine()) != null;){
System.out.println(temp);
}

}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


这是客户端:
public class ClientDemo implements Runnable {
Socket s;
BufferedReader br;
BufferedReader br2;
BufferedWriter bw;

@Override
public void run() {

try {
s = new Socket();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

while (true) {
System.out.println("client start!");
System.out.println(br.readLine());
bw.write("Client Test");
bw.flush();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}



多线程启动部分:
public class Main {

public static void main(String[] args) {
new Thread(new ClientDemo()).start();
new Thread(new ServerDemo()).start();
}
}


引用 1 楼 townsin 的回复:
客户端代码
new Socket();
->new Socket("localhost", 10000);
你没有指定服务器地址和端口号

我复制上来的时候打少("我的IP",10000)了,补上之后还是一直没链上 --------------------编程问答-------------------- 最好将读写放到不同的线程里,并在循环中追加sleep,不然也读取不到 --------------------编程问答-------------------- 你的启动类中,启动的顺序不对,应该先启动server 最好sleep一下 再启动client --------------------编程问答-------------------- 我想说,客户端socket的connect函数没有调用过,你是怎么指望它们会连接的? --------------------编程问答-------------------- 不需要connect~,你自己实际操作一下 --------------------编程问答-------------------- 服务端要先启动,之后才客服端才能运行吧。
你可以在一些代码后加上一些输出语句,比如accept() 加上System.out.println("接收成功");

然后看代码在哪个位置停了下来。
--------------------编程问答-------------------- 问题不在启动顺序上,我调整之后问题依旧,
Thread t2 = new Thread(new ServerDemo());
Thread t1 = new Thread(new ClientDemo());
t1.sleep(2000);
t2.start();
t1.start();
--------------------编程问答--------------------
引用 8 楼 fortheother 的回复:
服务端要先启动,之后才客服端才能运行吧。
你可以在一些代码后加上一些输出语句,比如accept() 加上System.out.println("接收成功");

然后看代码在哪个位置停了下来。

在accept之后就有使用输出语句打印说明服务器端已经启动了 --------------------编程问答-------------------- 服务器就在while循环里面停住了,客户端也一直连不上服务器 --------------------编程问答-------------------- 如果客户端能连上服务器,那么就是你客户端的write没有包含换行符,所以readLine并不觉得一行结束,所以不返回。你加个\n在write最后试试 --------------------编程问答--------------------
引用 10 楼 u011790240 的回复:
Quote: 引用 8 楼 fortheother 的回复:

服务端要先启动,之后才客服端才能运行吧。
你可以在一些代码后加上一些输出语句,比如accept() 加上System.out.println("接收成功");

然后看代码在哪个位置停了下来。

在accept之后就有使用输出语句打印说明服务器端已经启动了


引用 10 楼 u011790240 的回复:
Quote: 引用 8 楼 fortheother 的回复:

服务端要先启动,之后才客服端才能运行吧。
你可以在一些代码后加上一些输出语句,比如accept() 加上System.out.println("接收成功");

然后看代码在哪个位置停了下来。

在accept之后就有使用输出语句打印说明服务器端已经启动了



你能先测试下,不用多线程。看看启动服务端之后,在手动启动客户端,看看能否连接成功。

我怀疑是不是客服端的程序在先启动之后,发现没有服务端,它就死翘翘。
也不会去寻找服务端,也不会再次生成客服端。 --------------------编程问答-------------------- 将Client的Socket改成这 
引用
s = new Socket("127.0.0.1",10000);

在将启动顺序变一下
new Thread(new ServerDemo()).start();
Thread.sleep(100);
new Thread(new ClientDemo()).start();

另外你的i/o没有放在while中只能输入一次的,while在你这里没用,测试一下,改后是好使的
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,