finally { close();}你在服务器端干嘛要加这名呢?
while (true) {
Socket socket = accept();
new CreateServerThread(socket);
System.out.println("men : " + men);
}
而这里又是一个死循环, 当Close()后,又要服务端重新连接. 把这句删掉就可以了.
while (true) {
Socket socket = accept();
new CreateServerThread(socket);
System.out.println("men : " + men);
}
而这里又是一个死循环, 当Close()后,又要服务端重新连接. 把这句删掉就可以了.
怎么没有用户输入的端
不懂SOCKET
怎么没有用户输入的端
回复:
在客户端的控制台,输入字符串,回车后就把消息发到服务器里了,然后服务器再发一条新的消息显示在客户端的控制台上,通知客户端已经收到消息。
import java.net.*;
/*
设计原理:
主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,
将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。
这个程序监听10000端口,并将接入交给CreateServerThread线程运行。CreateServerThread线程接受输入,
并将输入回应客户,直到客户输入"bye",线程结束。我们可以在createMessage方法中,对输入进行处理,
并产生结果,然后把结果返回给客户。
*/
public class Server extends ServerSocket {
private static final int SERVER_PORT = 10000;//端口
static int men = 0;
public Server() throws IOException {
super(SERVER_PORT);
try {
while (true) {
Socket socket = accept();
new CreateServerThread(socket);
System.out.println("men : " + men);
}
} catch (IOException e) {} finally {
close();
}
}//--- CreateServerThread
class CreateServerThread extends Thread {
private Socket client;
private BufferedReader in;
private PrintWriter out; public CreateServerThread(Socket s) throws IOException {
Server.men = Server.men+1;
client = s; in = new BufferedReader(new InputStreamReader(client.getInputStream(),
"GB2312"));
out = new PrintWriter(client.getOutputStream(), true);
start();
} public void run() {
try {
String line = in.readLine();//客户端发出的text
while (!line.equals("bye")) {
String msg = createMessage(line);
try {
out.println(msg); //输出给客户端
} catch (Exception ex) {
System.out.println("out error");
}
line = in.readLine();//A 继续获取客户消息
//System.out.println("client input is : " + line);
}
out.println("--- See you, bye! ---");
System.out.println("client is closee");
client.close();
} catch (IOException e) {}
} private String createMessage(String line) {
String str = "Welcome! sever has get your input : " + line;
return str;
}
} public static void main(String[] args) throws IOException {
new Server();
}
}// 客户端
import java.io.*;
import java.net.*;public class Client extends Thread{
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
Thread thread = null;
BufferedReader line = null; public Client() { try {
socket = new Socket("127.0.0.1", 10000); //对网络上的服务器(192.168.0.5)的端口(10000)发出连接请求
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //从服务器读入流
out = new PrintWriter(socket.getOutputStream(), true); //用来向服务器发送控制台输入流的对象
line = new BufferedReader(new InputStreamReader(System.in)); //从控制台得到输入流
start();
} catch (IOException e) {
socket = null;
}
}
public void run()
{
while(true) {
try {
if (socket == null)
return;
String linestr = line.readLine(); //从控制台得到的text
out.println(linestr); //将从控制台得到的输入流发送到服务器
out.flush();
System.out.println("str from control:" + linestr);
String STR = in.readLine(); //得到从服务器发过来的text
System.out.println(STR);
// 客户提出终止则退出
if (linestr.equals("bye")){
out.close();
in.close();
socket.close();
System.out.println("socket closed");
break ; // 退出
}
} catch (IOException e) {
System.out.println(e.toString());
}
}
} public static void main(String[] args) {
//for (int i = 0; i < 2; i++)
new Client();
}
}
F:\>java Client
h
str from control:h
Welcome! sever has get your input : h
f
str from control:f
Welcome! sever has get your input : f
g
str from control:g
Welcome! sever has get your input : g
bye
str from control:bye
--- See you, bye! ---
socket closedF:\>
你的问题在于,你在客户端发送完成一次msg后,没有关闭连接
但你的服务器端已经将连接关闭了,所以你再次发送msg时会抛出
java.net.SocketException: Socket is closed 异常你这样做是不行的,要么连服务器端也改,要么两边都不要改
CreateServerThread 类中更改run如下,使之持续获取客户请求并回发给客户public void run() {
try {
String line = in.readLine();//客户端发出的text
while (!line.equals("bye")) {
String msg = createMessage(line);
try {
out.println(msg); //输出给客户端
} catch (Exception ex) {
System.out.println("out error");
}
line = in.readLine(); //A 继续获取客户消息
//System.out.println("client input is : " + line);
}
out.println("--- See you, bye! ---");
System.out.println("client is closee");
client.close();
} catch (IOException e) {}
}客户端Client类的run 方法中:while(true) {
try {
if (socket == null)
return;
String linestr = line.readLine(); //从控制台得到的text
out.println(linestr); //将从控制台得到的输入流发送到服务器
out.flush();
System.out.println("str from control:" + linestr);
String STR = in.readLine(); //得到从服务器发过来的text
System.out.println(STR);
// 客户提出终止则退出
if (linestr.equals("bye")){
out.close();
in.close();
socket.close();
System.out.println("socket closed");
break ; // 退出
}
} catch (IOException e) {
System.out.println(e.toString());
}
}