关于JAVA网络编程中的多线程,求指教!解决方案
关于JAVA网络编程中的多线程,求指教!
我要完成的功能是这样的:首先开启服务器,等待客户端连接。当客户端连接成功后,就进行数据处理。在这数据处理的同时,服务器还在监听状态,保持和客户端的连接!在这时候要完全的吧接收和发送分开,也就是说,客户端和服务器端都可以随时的进行数据的收发!我已经可以完成接收和发送了,但是还没有很好的去利用线程!请看一下我的具体代码:
开启服务器的类:
public class Start {
// private StringBuffer receive=null;
public static void main(String[] args) throws IOException{
Server server=new Server();
server.start();//启动服务器
StringBuffer receive=server.getReceive();
System.out.println("接收到的所有值为:"+receive.toString());
}
}
服务器开启,已经数据处理的类:
public class Server {
private ServerSocket serverSocket;
private Socket socket;
private StringBuffer receive;
/**
* 启动服务器
* @throws IOException
*/
public void start() throws IOException{
System.out.println("启动服务器") ;
serverSocket();//启动监听状态serverSocket()
//while(true){
Socket socket = serverSocket.accept();//得到客户端连接,程序进入到阻塞状态
SSocket ssocket=new SSocket(socket);
new Thread(ssocket).start();//执行线程
//}
}
/**
* 启动监听程序
* @throws IOException
*/
public void serverSocket() throws IOException{
System.out.println("服务器开始监听......");
this.serverSocket =new ServerSocket(8088) ;// 服务器在8888端口上监听
}
/**
* 得到客户端连接socket()
* @throws IOException
*/
public void socket() throws IOException{
System.out.println("主程序等待客户端连接......");
this.socket = serverSocket.accept();
}
/**
* 传人接收到的数据存到,返回接收到的数据
*/
public void setReceive(StringBuffer receiv){
this.receive=receiv;
}
/**
* 将接收到的数据返回
*/
public StringBuffer getReceive(){
return this.receive;
}
/**
* 发送数据,返回发送是否成功
* @throws IOException
public boolean sendServer(String send) throws IOException{
return true;
}*/
}
线程类:
/**
* 线程类
*/
public class SSocket extends Thread{
private StringBuffer receive=new StringBuffer();//接收
Socket socket=null;
public SSocket(Socket socket){
this.socket=socket;
}
/**
* 定义线程的run方法
*/
public void run(){
System.out.println("线程等待客户端连接......");
Server server=new Server();//创建Server类的对象
try {
PrintWriter output=new PrintWriter(socket.getOutputStream(),true );//输出流,发送数据到客户端
output.flush();//刷新数据
BufferedReader buf = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));//输入流,接收客户端的数据
boolean bContinue =true;
while(bContinue){
String reseiveSTR=buf.readLine();
System.out.println("接收到的值为:"+reseiveSTR);
if(reseiveSTR.equals("exit")){
System.out.println("接收到的所有值为:"+receive.toString());
server.setReceive(receive);//将接收到的数据传入到Server类
buf.close();
output.close();
bContinue =false;
System.out.println("关闭线程");
this.socket.close();
yield(); //向其他线程退让运行权
}
this.receive.append(reseiveSTR);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
------解决方案--------------------
呵呵正培训java呢。。我今天正好乱写了个。。仅作参考很垃圾的。。
我要完成的功能是这样的:首先开启服务器,等待客户端连接。当客户端连接成功后,就进行数据处理。在这数据处理的同时,服务器还在监听状态,保持和客户端的连接!在这时候要完全的吧接收和发送分开,也就是说,客户端和服务器端都可以随时的进行数据的收发!我已经可以完成接收和发送了,但是还没有很好的去利用线程!请看一下我的具体代码:
开启服务器的类:
public class Start {
// private StringBuffer receive=null;
public static void main(String[] args) throws IOException{
Server server=new Server();
server.start();//启动服务器
StringBuffer receive=server.getReceive();
System.out.println("接收到的所有值为:"+receive.toString());
}
}
服务器开启,已经数据处理的类:
public class Server {
private ServerSocket serverSocket;
private Socket socket;
private StringBuffer receive;
/**
* 启动服务器
* @throws IOException
*/
public void start() throws IOException{
System.out.println("启动服务器") ;
serverSocket();//启动监听状态serverSocket()
//while(true){
Socket socket = serverSocket.accept();//得到客户端连接,程序进入到阻塞状态
SSocket ssocket=new SSocket(socket);
new Thread(ssocket).start();//执行线程
//}
}
/**
* 启动监听程序
* @throws IOException
*/
public void serverSocket() throws IOException{
System.out.println("服务器开始监听......");
this.serverSocket =new ServerSocket(8088) ;// 服务器在8888端口上监听
}
/**
* 得到客户端连接socket()
* @throws IOException
*/
public void socket() throws IOException{
System.out.println("主程序等待客户端连接......");
this.socket = serverSocket.accept();
}
/**
* 传人接收到的数据存到,返回接收到的数据
*/
public void setReceive(StringBuffer receiv){
this.receive=receiv;
}
/**
* 将接收到的数据返回
*/
public StringBuffer getReceive(){
return this.receive;
}
/**
* 发送数据,返回发送是否成功
* @throws IOException
public boolean sendServer(String send) throws IOException{
return true;
}*/
}
线程类:
/**
* 线程类
*/
public class SSocket extends Thread{
private StringBuffer receive=new StringBuffer();//接收
Socket socket=null;
public SSocket(Socket socket){
this.socket=socket;
}
/**
* 定义线程的run方法
*/
public void run(){
System.out.println("线程等待客户端连接......");
Server server=new Server();//创建Server类的对象
try {
PrintWriter output=new PrintWriter(socket.getOutputStream(),true );//输出流,发送数据到客户端
output.flush();//刷新数据
BufferedReader buf = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));//输入流,接收客户端的数据
boolean bContinue =true;
while(bContinue){
String reseiveSTR=buf.readLine();
System.out.println("接收到的值为:"+reseiveSTR);
if(reseiveSTR.equals("exit")){
System.out.println("接收到的所有值为:"+receive.toString());
server.setReceive(receive);//将接收到的数据传入到Server类
buf.close();
output.close();
bContinue =false;
System.out.println("关闭线程");
this.socket.close();
yield(); //向其他线程退让运行权
}
this.receive.append(reseiveSTR);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
------解决方案--------------------
呵呵正培训java呢。。我今天正好乱写了个。。仅作参考很垃圾的。。
- Java code
/*服务器端代码*/ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class BasicServer extends Thread{ static ServerSocket ss; static Socket s; static BufferedWriter out; static BufferedReader in; static BufferedReader br; static boolean f = true; public void run(){ String str; while(f){ try { str = br.readLine(); out.write(str+"\n"); out.flush(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[]args){ try { ss = new ServerSocket(8838); Socket s = ss.accept(); out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); in = new BufferedReader(new InputStreamReader(s.getInputStream())); br = new BufferedReader(new InputStreamReader(System.in)); new BasicServer().start(); while(true){ String str2 = in.readLine(); System.out.println(InetAddress.getLocalHost()+"说:"+str2); if(str2.equals("end")) break; } BasicServer.f = false; br.close(); in.close(); out.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } } /*客户端代码*/ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; public class BasicClient extends Thread{ static Socket sc; static BufferedWriter out; static BufferedReader in; static BufferedReader br; static boolean f = true; public void run(){ String str; while(f){ try { str = br.readLine(); out.write(str+"\n"); out.flush(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[]args) throws IOException{ sc = new Socket(InetAddress.getLocalHost(),8838); in = new BufferedReader(new InputStreamReader(sc.getInputStream())); out = new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())); br = new BufferedReader(new InputStreamReader(System.in)); new BasicClient().start(); while(true){ String str2 = in.readLine(); System.out.println(InetAddress.getLocalHost()+"说:"+str2); if(str2.equals("end")) break; } BasicClient.f = false; out.close(); in.close(); br.close(); sc.close(); } } 我也新学java的。。可以来新建群里共同学习交流208779755