当前位置:  技术问答>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) {

}
}
}

|
最好先放在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()不知会不会有问题

|
估计是回车问题,用readLine一定要以n结束才会接收数据

|
我运行的时候并没有遇到你的问题。

不过总觉得在ExServiceThread中用readLine()不妥

因为这个方法只有在一行读完以后才结束,也就是说如果没有遇到'nr'这种字符或者你在输入后没有按回车,它始终处于等待状态。

你将你输入XML的方法讲一下,在讨论吧

|
一个简单的方法是直接System.exit(1);

    
 
 

您可能感兴趣的文章:

  • Java中多线程相关类Thread介绍
  • java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • java基本教程之多线程基本概念 java多线程教程
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • 用什么方法可以查看在windows下jvm下运行当前java程序的线程数和线程名称?
  • java多线程编程之捕获子线程异常示例
  • java线程怎么调用java的application.class?
  • java多线程编程之使用runnable接口创建线程
  • java线程中如何降低CPU的占用率?我这几个线程会不会死锁?
  • java线程之使用Runnable接口创建线程的方法
  • java 多线程问题
  • Java线程的相关方法详细解析
  • 紧急求助java多线程编程!!!!!!!!!!!!!
  • java线程,回答得比较深就好了
  • Java多线程之中断线程(Interrupt)的使用详解
  • 关于java线程调度优先级
  • java基本教程之线程让步 java多线程教程
  • Java多线程单元测试 Thread Weaver
  • 求教JAVA中的延时函数!不是用于线程中的!
  • java中多线程的问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • JAVA中的 SOCKET能否与DELPHI中的 SOCKET进行通信
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • help! JAVA下有类似VC++ 下的socket 类吗?请各位高手看一下!!
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • 请大家推荐一下java里socket编程的资料。
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • 怎么样利用Socket进行Java网络编程
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • JAVA网络编程(socket),用什么工具开发?怎么配置环境?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java读写包括中文的txt文件时不同编码格式问题解决
  • 菜鸟的问题:java与java script 的异同??
  • java新手的问题,java高手帮忙...
  • 低级问题:.java文件交付用户怎么运行,难道也是DOS下:java xx.java?有没有.exe?
  • 请各位java高手几个java有关的问题?
  • java.sql.Date和java.uitl.Date的问题?
  • 问大哥大姐们个问题啊,小第编了自己的第一个JAVA问题。用JAVAC编译能通过啊!可是用JAVA不能执行啊!
  • 最入门级的java问题,如何运行HelloWorld.java
  • 请教一些JAVA的基本问题,初学JAVA有些迷糊,帮帮忙!总迷糊实在受不了了!
  • Linux下面的开发好的Java程序,如何部署到其他机器?开发好的Java图形程序,终端上能否用?等问题
  • 关于JAVA应用程序(Java Application)的deliver问题
  • 请Linux 和Java 的高手回答:java JDK1.3.1 在红旗Linux Desktop 2.4 的问题,一定给分。
  • 一个极其菜的问题:JAVA,VISUAL J++,JAVA SCRIPT,EJB,它们之间到底有什么关系,谢谢!
  • 我的Javac没有问题,但是java有问题,
  • 一个JAVA继承的问题(Thinking in JAVA里的一个例子)
  • 刚学习Java,请教关于Java的Application代码编写问题。
  • 我所学的是计算机,现在想学JAVA,对JAVA绝对是初学!!!可以交流的留下个地址。肯定给分,不过非完分后就是问题,问题,问题了;)有留E-mail至少1分
  • 两个非常简单的问题,给40分 (才学2天JAVA人的问题)
  • 问个简单的低级又很怪的问题,我在编译*.java的问题。
  • java学习的问题<问题解决立即结贴>?
  • 我是学pb的,有一个问题想请教各位java的朋友,j2ee平台是什么啊?如果要用这个平台的开发pb的话是否要学java??
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3