当前位置: 技术问答>java相关
Java中多线程和Socket的问题?
来源: 互联网 发布时间:2015-07-13
本文导语: 现在我在用Java做一个传输XML文档的程序。 刚做了一个框架,但碰到了一些问题,请各位老大诊断一下。 程序用TCP协议进行传输,多用户连接使用多线程解决。 程序由三个类组成,两个线程类,一个主类。 ExServer ...
现在我在用Java做一个传输XML文档的程序。
刚做了一个框架,但碰到了一些问题,请各位老大诊断一下。
程序用TCP协议进行传输,多用户连接使用多线程解决。
程序由三个类组成,两个线程类,一个主类。
ExServer 是主类。它创建一个连接请求侦听线程(ExListenThread ),之后相应用户操作命令(例如收到
quit后结束程序运行)
ExListenThread 是连接请求侦听线程,接受用户连接请求,创建服务线程(ExServiceThread)处理接受数据。
ExServiceThread 是服务线程。接收XML文档并显示出来。XML文档以结尾,接受完文档线程结束。
现在的问题是:
发送一个XML文档没有问题,收到数据很正确的显示出来。
接着发第二、第三、第四个XML文档。控制台中没有动静,数据显示不出来。但在控制台随便输入几个字符。第
二、第三、第四个XML文档唰一下全出来了。其中第二个文档必定是不完整的,缺一部分数据。之后的第三、第
四个文档又是完整的。
请大家分析一下是什么原因?是多线程共同向system.out写东西时的冲突问题?还是Socket中数据丢失的问题
?大家有什么更好的建议能解决这些问题?谢谢!
下面是代码:
import java.io.*;
import java.net.*;
class ExServiceThread extends Thread {
private Socket m_socket;
private BufferedReader in;
private PrintWriter out;
public ExServiceThread (Socket s) throws IOException {
m_socket=s;
in = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(m_socket.getOutputStream())),true);
start();
}
public void run() {
try {
while (true) {
String str = in.readLine();
System.out.println("Receive:"+str);
out.println("Data OK.");
if (str.equals("")) break;
}
System.out.println("Closing...");
} catch (IOException e) {
} finally {
try { m_socket.close();}
catch (IOException e) {}
}
}
}
class ExListenThread extends Thread {
static final int PORT =82;
private ServerSocket m_socket;
private boolean stop=false;
public ExListenThread() throws IOException {
m_socket = new ServerSocket(PORT);
start();
}
public void terminate() {stop=true;}
public void run(){
System.out.println("server started:");
try {
while (!stop) {
Socket c_socket =m_socket.accept();
try {
new ExServiceThread(c_socket);
} catch (IOException e) {
c_socket.close();
}
}
} catch (IOException e) {
}finally {
try {
m_socket.close();
}catch (IOException e) {}
}
}
}
public class ExServer {
public static void main(String[] args) throws IOException {
try {
ExListenThread listenthread=new ExListenThread();
while (true){
BufferedReader stdin =new BufferedReader(new
InputStreamReader(System.in));
String str=stdin.readLine();
if (str.equals("quit")) {
listenthread.terminate();
break;
}
}
} catch (IOException e) {
}
}
}
刚做了一个框架,但碰到了一些问题,请各位老大诊断一下。
程序用TCP协议进行传输,多用户连接使用多线程解决。
程序由三个类组成,两个线程类,一个主类。
ExServer 是主类。它创建一个连接请求侦听线程(ExListenThread ),之后相应用户操作命令(例如收到
quit后结束程序运行)
ExListenThread 是连接请求侦听线程,接受用户连接请求,创建服务线程(ExServiceThread)处理接受数据。
ExServiceThread 是服务线程。接收XML文档并显示出来。XML文档以结尾,接受完文档线程结束。
现在的问题是:
发送一个XML文档没有问题,收到数据很正确的显示出来。
接着发第二、第三、第四个XML文档。控制台中没有动静,数据显示不出来。但在控制台随便输入几个字符。第
二、第三、第四个XML文档唰一下全出来了。其中第二个文档必定是不完整的,缺一部分数据。之后的第三、第
四个文档又是完整的。
请大家分析一下是什么原因?是多线程共同向system.out写东西时的冲突问题?还是Socket中数据丢失的问题
?大家有什么更好的建议能解决这些问题?谢谢!
下面是代码:
import java.io.*;
import java.net.*;
class ExServiceThread extends Thread {
private Socket m_socket;
private BufferedReader in;
private PrintWriter out;
public ExServiceThread (Socket s) throws IOException {
m_socket=s;
in = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(m_socket.getOutputStream())),true);
start();
}
public void run() {
try {
while (true) {
String str = in.readLine();
System.out.println("Receive:"+str);
out.println("Data OK.");
if (str.equals("")) break;
}
System.out.println("Closing...");
} catch (IOException e) {
} finally {
try { m_socket.close();}
catch (IOException e) {}
}
}
}
class ExListenThread extends Thread {
static final int PORT =82;
private ServerSocket m_socket;
private boolean stop=false;
public ExListenThread() throws IOException {
m_socket = new ServerSocket(PORT);
start();
}
public void terminate() {stop=true;}
public void run(){
System.out.println("server started:");
try {
while (!stop) {
Socket c_socket =m_socket.accept();
try {
new ExServiceThread(c_socket);
} catch (IOException e) {
c_socket.close();
}
}
} catch (IOException e) {
}finally {
try {
m_socket.close();
}catch (IOException e) {}
}
}
}
public class ExServer {
public static void main(String[] args) throws IOException {
try {
ExListenThread listenthread=new ExListenThread();
while (true){
BufferedReader stdin =new BufferedReader(new
InputStreamReader(System.in));
String str=stdin.readLine();
if (str.equals("quit")) {
listenthread.terminate();
break;
}
}
} catch (IOException e) {
}
}
}
|
最好先放在buffer里,一次发过来。
|
我想你应该是用一个socket连82端口,然后将xml传过去。我做了一个,试了一下,没问题
import java.io.*;
import java.net.*;
public class Test {
public static void main(String[] args) {
try{
Socket socket = new Socket("localhost",82);
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.println("");
out.println("");
out.println("hello");
out.println("");
out.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
顺便提一下,每次用完I/O最好close()掉,不close()不知会不会有问题
import java.io.*;
import java.net.*;
public class Test {
public static void main(String[] args) {
try{
Socket socket = new Socket("localhost",82);
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.println("");
out.println("");
out.println("hello");
out.println("");
out.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
顺便提一下,每次用完I/O最好close()掉,不close()不知会不会有问题
|
估计是回车问题,用readLine一定要以n结束才会接收数据
|
我运行的时候并没有遇到你的问题。
不过总觉得在ExServiceThread中用readLine()不妥
因为这个方法只有在一行读完以后才结束,也就是说如果没有遇到'nr'这种字符或者你在输入后没有按回车,它始终处于等待状态。
你将你输入XML的方法讲一下,在讨论吧
不过总觉得在ExServiceThread中用readLine()不妥
因为这个方法只有在一行读完以后才结束,也就是说如果没有遇到'nr'这种字符或者你在输入后没有按回车,它始终处于等待状态。
你将你输入XML的方法讲一下,在讨论吧
|
一个简单的方法是直接System.exit(1);