这是我写的Socket程序,在一台电脑上测试就连接成功,用两台电脑分别服务器客户端就失败了。
我确定双方的防火墙什么都关了,也用管理员权限运行。
求大神看看问题出在哪里?服务器:
package server;import java.net.*;
import java.io.*;public class Server { private ServerSocket server;
private Socket client; public Server() {
boolean flag = true;
try {
server = new ServerSocket(8888); //端口
System.out.println("服务器正在等到客户端连接......");
while (flag) {
client = server.accept(); //阻塞
new ServerThread(client).start();
}
server.close();
} catch (Exception e) {
}
} public static void main(String[] args) {
new Server();
} private class ServerThread extends Thread { private Socket clientThread;
private PrintStream out;
private BufferedReader in;
private boolean flag = true; public ServerThread(Socket client) {
this.clientThread = client;
System.out.println("主机与客户端成功建立连接,开始通讯!!");
} public void run() {
try {
/*
* 超时判断:设置超时时间300秒,中断连接或者300秒内客户端无回应信息则认为中断
* 缺点便是必须把超时时间设置很长,否则客户端待机也认为超时处理,无法判断是否端口
*/
clientThread.setSoTimeout(300000);
out = new PrintStream(client.getOutputStream());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
while (flag) {
String str = in.readLine(); //阻塞
System.out.println("客户端:" + str);
out.println("主机成功接收到您的信息!!");
}
client.close();
} catch (Exception e) {
//如果异常是连接异常,则输出连接断开
if (e.getMessage() == "Connection reset") {
System.out.println("客户端已断开连接!!");
}
}
}
}
}
客户端:
package client;import java.net.*;
import java.io.*;public class Client { private Socket client; public Client() {
try {
System.out.println("正在连接服务器......"); client = new Socket("192.168.218.168", 8888); //阻塞
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintStream out = new PrintStream(client.getOutputStream());;
boolean flag = true; System.out.println("成功连接到主机,开始通讯!!"); while (flag) {
System.out.printf("请输入信息:");
out.println(input.readLine()); //阻塞
//判断是否与主机断开
if (isConnected()) {
System.out.println("发生成功!!");
System.out.println("主机:" + in.readLine());
} else {
System.out.println("发生失败!!");
System.out.println("与服务器断开连接!!");
client.close();
break;
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
} //判断服务器是否断开的方法,
//通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接
//但会与正常的传送干扰,所以用sendUrgenData
public boolean isConnected() {
try {
client.sendUrgentData(0xFF);
return true;
} catch (Exception e) {
return false;
}
} public static void main(String[] args) {
new Client();
}
}socketjava通讯服务器客户端
我确定双方的防火墙什么都关了,也用管理员权限运行。
求大神看看问题出在哪里?服务器:
package server;import java.net.*;
import java.io.*;public class Server { private ServerSocket server;
private Socket client; public Server() {
boolean flag = true;
try {
server = new ServerSocket(8888); //端口
System.out.println("服务器正在等到客户端连接......");
while (flag) {
client = server.accept(); //阻塞
new ServerThread(client).start();
}
server.close();
} catch (Exception e) {
}
} public static void main(String[] args) {
new Server();
} private class ServerThread extends Thread { private Socket clientThread;
private PrintStream out;
private BufferedReader in;
private boolean flag = true; public ServerThread(Socket client) {
this.clientThread = client;
System.out.println("主机与客户端成功建立连接,开始通讯!!");
} public void run() {
try {
/*
* 超时判断:设置超时时间300秒,中断连接或者300秒内客户端无回应信息则认为中断
* 缺点便是必须把超时时间设置很长,否则客户端待机也认为超时处理,无法判断是否端口
*/
clientThread.setSoTimeout(300000);
out = new PrintStream(client.getOutputStream());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
while (flag) {
String str = in.readLine(); //阻塞
System.out.println("客户端:" + str);
out.println("主机成功接收到您的信息!!");
}
client.close();
} catch (Exception e) {
//如果异常是连接异常,则输出连接断开
if (e.getMessage() == "Connection reset") {
System.out.println("客户端已断开连接!!");
}
}
}
}
}
客户端:
package client;import java.net.*;
import java.io.*;public class Client { private Socket client; public Client() {
try {
System.out.println("正在连接服务器......"); client = new Socket("192.168.218.168", 8888); //阻塞
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintStream out = new PrintStream(client.getOutputStream());;
boolean flag = true; System.out.println("成功连接到主机,开始通讯!!"); while (flag) {
System.out.printf("请输入信息:");
out.println(input.readLine()); //阻塞
//判断是否与主机断开
if (isConnected()) {
System.out.println("发生成功!!");
System.out.println("主机:" + in.readLine());
} else {
System.out.println("发生失败!!");
System.out.println("与服务器断开连接!!");
client.close();
break;
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
} //判断服务器是否断开的方法,
//通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接
//但会与正常的传送干扰,所以用sendUrgenData
public boolean isConnected() {
try {
client.sendUrgentData(0xFF);
return true;
} catch (Exception e) {
return false;
}
} public static void main(String[] args) {
new Client();
}
}socketjava通讯服务器客户端
解决方案 »
- java 线程同步的类和非线程同步的类(api中的类)有什么区别?
- 出现Exception in thread "main" java.lang.NullPointerException求指教,急急急
- GUI编程学习第一弹:《计算器》。尽量面相对象,但依然不给力。仍旧全文注释,大家一起勉励
- java与输入法请教
- 一个线程的问题
- 求助接口Observer的使用方法
- 新手关于一段JAVA程序的问题,找不到错在哪里,请指点
- 高手来帮我一下,一个小程序
- 各位前辈,我该采用java吗?
- 如何用JBuilder7编译多层目录结构
- 在DOS下编译运行Java到eclipse如何让切换
- 启动外部程序,启动后就不管了
其次,你那个服务器的地址是192.168.218.168么?
第三,服务器的那台电脑的端口8888是否被占用?
服务器地址就是我的IP,服务器也在我的电脑开,另一台客户端是跟我同一个局域网的,我用WINapi写的SOCKET可以联机。端口我也怕被人占有,所以我换了其他端口,还是不行。
服务器地址就是我的IP,服务器也在我的电脑开,另一台客户端是跟我同一个局域网的,我用WINapi写的SOCKET可以联机。端口我也怕被人占有,所以我换了其他端口,还是不行。
既然连不通,总会报一些异常
或者
执行到哪里就停滞了吧?
这些信息呢?
服务器地址就是我的IP,服务器也在我的电脑开,另一台客户端是跟我同一个局域网的,我用WINapi写的SOCKET可以联机。端口我也怕被人占有,所以我换了其他端口,还是不行。
既然连不通,总会报一些异常
或者
执行到哪里就停滞了吧?
这些信息呢?
服务器什么都没提示,客户端提示连接主机失败而已,不过我刚刚试了另一台电脑,竟然可以了,不知道为什么。
好吧那这个问题略过,大神我再问你一个,如果客户端强制关闭,则服务器会抛出异常,得到客户端断开的消息。但如果我的客户端不关闭,只是用client.close();方法关闭而已,服务器不会抛出异常,而且服务器会不停收到客户端发来的Null消息。这是为什么?
try {
client.sendUrgentData(0xFF);
return true;
} catch (Exception e) {
return false;
}
}
这里改成
public boolean isConnected() {
try {
client.sendUrgentData(0xFF);
return true;
} catch (Exception e) {
e.printStackTrack();//添加这个,这里你直接忽略了异常,当然不会有提示。。
return false;
}
}另外
无论客户端是否关闭
while (flag) {
String str = in.readLine(); //阻塞
System.out.println("客户端:" + str);
out.println("主机成功接收到您的信息!!");
}
你不觉得这个是个死循环么?
我上面那个是简略版的,后来我又写了个比较完善的,就是上面的死循环加入一个判断,是
if (str == null){
System.out.println("客户端已断开连接!!");
break;
}
就是因为客户端close后会不断发送Null给主机,我加了这个判断。
然后我发现,客户端close之后,主机也不会提示客户端断开连接而结束线程,总是,一片乱。
我不知道我思路有没有问题,你能否给我个大概的思路?
就是客户端断开连接要通过close结束的,而不是关掉整个程序。
谢谢你了
服务器地址就是我的IP,服务器也在我的电脑开,另一台客户端是跟我同一个局域网的,我用WINapi写的SOCKET可以联机。端口我也怕被人占有,所以我换了其他端口,还是不行。
既然连不通,总会报一些异常
或者
执行到哪里就停滞了吧?
这些信息呢?
服务器什么都没提示,客户端提示连接主机失败而已,不过我刚刚试了另一台电脑,竟然可以了,不知道为什么。
好吧那这个问题略过,大神我再问你一个,如果客户端强制关闭,则服务器会抛出异常,得到客户端断开的消息。但如果我的客户端不关闭,只是用client.close();方法关闭而已,服务器不会抛出异常,而且服务器会不停收到客户端发来的Null消息。这是为什么?其实你可以让客户端关闭的同时给服务器发送一条“close”指令。这样服务器就不会再接受该客户端的信息了。