将线程用在socket上面,老是实现不了,非常不解...请各位高手指点一下。
package work_2;import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Panel;
import java.awt.BorderLayout;import java.net.Socket;
import java.net.UnknownHostException;import java.io.InputStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.PrintWriter;public class chat_client extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
JButton jb = new JButton("start");
List list = new List();
Panel p1 = new Panel(), p2 = new Panel();
Socket s = null;
InputStream ip = null;
PrintWriter pw;
InputStreamReader ir = null;
BufferedReader br = null; chat_client() {
jb.addActionListener(this);
this.setLayout(new BorderLayout());
this.add(list, BorderLayout.CENTER);
this.add(p1, BorderLayout.SOUTH);
p1.setLayout(new BorderLayout());
p1.add(jb, BorderLayout.EAST);
this.setSize(275, 345);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
s = new Socket("season", 3000);
} catch (UnknownHostException ue) {
list.add("UnknownHostException");
System.exit(0);
} catch (IOException ie) {
list.add("IOException");
System.exit(0);
}
new Thread(run()).start();
} private Runnable run() {
// TODO Auto-generated method stub
if (s != null) {
while (true) {
try {
ip = s.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
list.add(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
list = new List();
list.add("IOException :can't get data");
}
}
}else{
System.exit(0);
}
return run();
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_client();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
try {
pw = new PrintWriter(s.getOutputStream());
pw.println("ok ");
pw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("op error");
}
} }
}
package work_2;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JButton;import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.PrintWriter;
public class chat_server extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
JButton jb = new JButton("work");
ServerSocket ss = null;
Socket s = null;
InputStream ip = null;
InputStreamReader ir = null;
BufferedReader br = null;
PrintWriter pw; chat_server() {
jb.addActionListener(this);
this.setLayout(new FlowLayout());
this.add(jb);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(200, 100);
this.setVisible(true);
try {
ss = new ServerSocket(3000);
} catch (IOException ie) {
System.exit(0);
System.out.println("IOException on newing");
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_server();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
new Thread(run()).start();
}
} private Runnable run() {
// TODO Auto-generated method stub
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
return run();
} private Runnable run2(Socket s2) {
// TODO Auto-generated method stub
if (s2 != null) {
try {
ip = s2.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
String string = br.readLine().trim();
pw = new PrintWriter(s2.getOutputStream());
pw.println(string);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("thread2 ");
}
}
return run2(s2);
}}
首先谢谢看完的朋友,再多谢回答的朋友,这个线程和socket自己学着感觉问题很多,而且自己动手写的没有运行到过..搞到我人都烦了.所以请高手指点下.
package work_2;import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Panel;
import java.awt.BorderLayout;import java.net.Socket;
import java.net.UnknownHostException;import java.io.InputStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.PrintWriter;public class chat_client extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
JButton jb = new JButton("start");
List list = new List();
Panel p1 = new Panel(), p2 = new Panel();
Socket s = null;
InputStream ip = null;
PrintWriter pw;
InputStreamReader ir = null;
BufferedReader br = null; chat_client() {
jb.addActionListener(this);
this.setLayout(new BorderLayout());
this.add(list, BorderLayout.CENTER);
this.add(p1, BorderLayout.SOUTH);
p1.setLayout(new BorderLayout());
p1.add(jb, BorderLayout.EAST);
this.setSize(275, 345);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
s = new Socket("season", 3000);
} catch (UnknownHostException ue) {
list.add("UnknownHostException");
System.exit(0);
} catch (IOException ie) {
list.add("IOException");
System.exit(0);
}
new Thread(run()).start();
} private Runnable run() {
// TODO Auto-generated method stub
if (s != null) {
while (true) {
try {
ip = s.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
list.add(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
list = new List();
list.add("IOException :can't get data");
}
}
}else{
System.exit(0);
}
return run();
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_client();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
try {
pw = new PrintWriter(s.getOutputStream());
pw.println("ok ");
pw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("op error");
}
} }
}
package work_2;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JButton;import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.PrintWriter;
public class chat_server extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
JButton jb = new JButton("work");
ServerSocket ss = null;
Socket s = null;
InputStream ip = null;
InputStreamReader ir = null;
BufferedReader br = null;
PrintWriter pw; chat_server() {
jb.addActionListener(this);
this.setLayout(new FlowLayout());
this.add(jb);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(200, 100);
this.setVisible(true);
try {
ss = new ServerSocket(3000);
} catch (IOException ie) {
System.exit(0);
System.out.println("IOException on newing");
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_server();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
new Thread(run()).start();
}
} private Runnable run() {
// TODO Auto-generated method stub
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
return run();
} private Runnable run2(Socket s2) {
// TODO Auto-generated method stub
if (s2 != null) {
try {
ip = s2.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
String string = br.readLine().trim();
pw = new PrintWriter(s2.getOutputStream());
pw.println(string);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("thread2 ");
}
}
return run2(s2);
}}
首先谢谢看完的朋友,再多谢回答的朋友,这个线程和socket自己学着感觉问题很多,而且自己动手写的没有运行到过..搞到我人都烦了.所以请高手指点下.
解决方案 »
- Java+JDBC环境变量问题,新人小白求助
- 在线急等 PB的字符加密算法在JAVA中为什么不能实现?????
- 请大家指教.急等
- 在JBilder2005中,按钮怎样加图片?
- 怎样触发choice的事件
- one big question!!!!! ALL SCORES
- 有人能把C转换成java吗,在线等!有C源码
- 请问在java中如何调用窗口最大化和最小化方法?
- 在jbuilder 7 中我设置了窗体的layout属性为xylayout,但是我用ie6.0打开网页时无法显示控件!紧急!!!在线等待!谢谢!
- 我现在觉得理解了面对对象编程,但又感觉不到java好的地方,是不是没有用到?
- 新手问题,大家帮忙看下好吗
- javaj基础常见错误总结21个,7-12
// TODO Auto-generated method stub
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
return run();
}
return run();
你程序能跑的好好的?
private Runnable run() {
// TODO Auto-generated method stub
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
return run();
}这一块没能看懂
new Thread(new Runnable(){
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
}).start();
只有启动线程就没有问题了
new Thread(new Runnable(){
public void run() {
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
}
}).start();
忘了run方法
回复1楼的hxl1013 :
我觉得可以,只要将1个Runnable类附在线程上就行了吧.回复2楼的yuchui :
我测试的时候,基本能完成客户端的操作,但是在客户端断开连接的时候,服务端出错,抛出lang的溢出异常:回复3楼的Sniper_Killer :
创建线程的目的是想要监听Socket,在接收到客户方的信息的时候可以再新建1个线程分配给它,完成信息的接收以及相关的操作回复4楼的xiongwenhua365 :
我这么写是想在这个监督Socket的线程里面也给每个接收到的信息分配1个子的线程.回复5楼的xuhua205 :
这个我试了下,但是在客户端只能显示到1个ok(正确的是显示100行ok),然后客户端就不能工作了.我都不清楚怎么回事.多谢大家的建议以及指点!有错的地方,不妨用直接以及激进的口吻指出.
另一个是extends thread一个类,然后直接START。
改一下写法大概就行了。
以下是本人的总结,不正确请高人指出!
错误1:构建线程错误:不能直接构建Runnable run()方法,应该构建类再extends Runnable;
错误2:服务方的接收条件,应该是在s != null的情况下循环(这点是我的理解出了问题);
错误3:没有考虑到线程的运行原理,由于系统都是时分的,所以每个线程都有一定的工作时间,如果超时,就会出现显示信息不足够的错误.以下是修改之后的代码,给大家分享,虽然这个代码很+very+十分基础,但是也来个班门弄斧,因为总不能老是发错误的代码吧!
package work_2;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JButton;import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.PrintWriter;import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;public class chat_server extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
JButton jb = new JButton("work");
ServerSocket ss = null;
Socket s = null;
InputStream ip = null;
InputStreamReader ir = null;
BufferedReader br = null;
// OutputStream op = null;
PrintWriter pw;
ExecutorService exec = Executors.newFixedThreadPool(100); chat_server() {
jb.addActionListener(this);
this.setLayout(new FlowLayout());
this.add(jb);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(200, 100);
this.setVisible(true);
try {
ss = new ServerSocket(3000);
} catch (IOException ie) {
System.exit(0);
System.out.println("IOException on newing");
}
// new Thread(run()).start();
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_server();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
new Thread_1().start();
}
} class Thread_1 extends Thread {
// TODO Auto-generated method stub
public void run() {
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread_2(s).start();
} catch (IOException e) {
System.exit(0);
}
}
}
} } class Thread_2 extends Thread {
private Socket socket; Thread_2(Socket so) {
this.socket = so;
} public void run() {
try {
ip = socket.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
while (socket != null) {
String string = br.readLine().trim();
pw = new PrintWriter(socket.getOutputStream(), true);
pw.println(string);
}
} catch (IOException e) {
//这里会报错的,是因为Socket关闭的时候pw再也print不到了;
//大家可以去完善一下;
}
}
}}
package work_2;import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Panel;
import java.awt.BorderLayout;import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;import java.io.InputStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader; //import java.io.OutputStream;
import java.io.PrintWriter;public class chat_client extends JFrame implements ActionListener { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
JButton jb = new JButton("start");
List list = new List();
Panel p1 = new Panel(), p2 = new Panel();
Socket s = null;
InputStream ip = null;
PrintWriter pw;
InputStreamReader ir = null;
BufferedReader br = null; chat_client() {
jb.addActionListener(this);
this.setLayout(new BorderLayout());
this.add(list, BorderLayout.CENTER);
this.add(p1, BorderLayout.SOUTH);
p1.setLayout(new BorderLayout());
p1.add(jb, BorderLayout.EAST);
this.setSize(275, 345);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
s = new Socket("season", 3000);
} catch (UnknownHostException ue) {
list.add("UnknownHostException");
System.exit(0);
} catch (IOException ie) {
list.add("IOException");
System.exit(0);
}
new Thread(run()).start();
} private Runnable run() {
// TODO Auto-generated method stub
if (s != null) {
while (true) {
try {
ip = s.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
list.add(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
list = new List();
list.add("IOException :can't get data");
}
}
} else {
System.exit(0);
}
return run();
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_client();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
try {
pw = new PrintWriter(s.getOutputStream(), true);
for (int i = 0; i < 10; i++)
{
pw.println("ok ");
try {
TimeUnit.MILLISECONDS.sleep(20);
//添加时间间隔的目的是为了让线程有足够的时间发送信息;
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("op error");
}
} }
}
在此再次多谢关注帖子的朋友,谢谢,敬礼.