-------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo implements Runnable { private int port = 9990;
private ServerSocket server = null;
private boolean isRunning;
public static void main(String[] args) {
ServerDemo sd = new ServerDemo();
new Thread(sd).start();
} public void run() {
isRunning = true;
try {
server = new ServerSocket(port);
System.out.println(server.getClass().getName());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(isRunning) {
try {
Socket client = server.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while(true) {
String message = in.readLine();
System.out.println(message);
out.println("has recieved");
out.flush();
if("end".equals(message)) {
System.out.println("It has been completed");
client.close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
-------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientDemo implements Runnable { public void run() {
Socket server = null;
try {
server = new Socket(InetAddress.getLocalHost(), 9990);
System.out.println(server.getClass().getName());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter out;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(server
.getInputStream()));
out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)); while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
if (str.equals("end")) {
break;
}
System.out.println(in.readLine());
}
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
-------------------------------------------------------------------public class ClientDemo2 { public static void main(String[] args) throws Exception {
new Thread(new ClientDemo()).start();
}}
-------------------------------------------------------------------
public class ClientDemo3 { public static void main(String[] args) throws Exception {
new Thread(new ClientDemo()).start();
}}
-------------------------------------------------------------------
ServerDemo是服务端,client是客户端功能:客户端发送字符串,服务端接受后打印,并返回"has recieve"表示已经收到问题描述:运行ClientDemo2后,我在控制台打字,没问题,就是打一行,服务端就能接受一行,
然后我再运行ClientDemo3,但他不想ClientDemo2那样,接受一行打印一行,
把ClientDemo2停止后,ClientDemo3的控制台会有很多的"has recieve"打印出来我想是ClientDemo2和3可以同时向服务端发送,服务端也可以同时对这2个线程做出反馈,
请高手帮忙看看,问题出在那里,因为我线程不是很懂,所以还请大家多多指教
解决方案 »
- hibernate查询关联对象为空的问题
- 我的这个简单的算法错在哪呀?再简单不过的代码了 我真笨
- 如何JavaEE中物理删除服务器上的图片的方法
- 今天学习Java遇到几个问题,想不通过了,各位高手帮帮忙!
- 配置struts的时候出现的错误什么意思啊?File "/tags/struts-html" not found
- 安装Tomcat出现问题,请高手解决.
- 怎样防止用户后退访问页面?、、、、、、、、
- javamail的问题
- 请问从基本JAVA到J2EE Struts servlet ejb 怎么个学习 ?
- 弱弱的问一下关于tomcat
- 请问jni能做到远程jsp+java调用本地c++程序中的函数吗?
- java调c++程序中的函数怎么实现?
2退出后,3那边有很多has recieve,而且服务端控制台报错了
java.net.SocketException: socket closed请问这个程序需要怎么改进
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo implements Runnable{ private int port=9990; private ServerSocket server=null; private boolean isRunning; public static void main(String[] args){
ServerDemo sd=new ServerDemo();
}
public ServerDemo(){
try{
server=new ServerSocket(port);
System.out.println(server.getClass().getName());
}
catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
isRunning=true;
for(int i=0;i<5;i++){
new Thread(this).start();
}
} public void run(){
while(isRunning){
try{
Socket client=server.accept();
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true){
String message=in.readLine();
System.out.println(message);
out.println("has recieved");
out.flush();
if("end".equals(message)){
System.out.println("It has been completed");
client.close();
}
}
}
catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}---------------------
另外 2退出后, 服务端报异常是正常的, 因为服务端还在读,但socket已关闭了, 这是正常的
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo implements Runnable { private int port = 9990;
private ServerSocket server = null;
private boolean isRunning;
public static void main(String[] args) {
ServerDemo sd = new ServerDemo();
new Thread(sd).start();
} public void run() {
isRunning = true;
try {
server = new ServerSocket(port);
System.out.println(server.getClass().getName());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(isRunning) {
try {
Socket client = server.accept();
DoForServer dfs = new DoForServer();
dfs.setClient(client);
new Thread(dfs).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
--------------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class DoForServer implements Runnable { private Socket client = null; public void run() {
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(client
.getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream()); while (true) {
String message = in.readLine();
System.out.println(message);
out.println("has recieved");
out.flush();
if ("end".equals(message)) {
System.out.println("It has been completed");
client.close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public Socket getClient() {
return client;
} public void setClient(Socket client) {
this.client = client;
}
}
这样改了后,可以多个控制台一起输入,并且服务端都会返回提示,但是关闭一个后
(输入"end",关闭socket时,服务端会报错
java.net.SocketException: socket closed 是正常情况吗