本人初学JAVA,练习写段代码:基于SOCKET的多线程(有一个连接进来就生成一个通信线程,每个通信线程又有一个接收线程和一个发送线程)聊天程序。
现在的问题是:服务端提示已连接,但是不能互相通信。
估计在把SOCKET对象传递到接收线程和发送线程时出现问题。望各位达人帮小弟看看!
/////////////////////////服务端代码////////////////////////////////////
import java.io.*;
import java.net.*;
class SocketThread extends Thread
{ Recv r;
Send send;
private Socket server1;
SocketThread(Socket s)
{
server1 = s;
r=new Recv(server1);
send=new Send(server1);
start();
}
public void run()
{
System.out.println("欢迎进入聊天室");
System.out.println(server1.getInetAddress().getHostAddress() + "已经连接!");
r.start();
send.start();
while(true){
;
}
}
}class Recv extends Thread
{
String ClientString;
BufferedReader bf;
boolean done;
Socket sock;
Recv(Socket s)
{
sock=s;
done=true;
ClientString=new String();
try{
bf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!ClientString.equals("88"))
{
try{
ClientString=bf.readLine();
System.out.println("CLIENT:"+ClientString);
}
catch(IOException e){
System.out.println("输入输出异常:未发现客户端输入流!" + e.getMessage());
}
}
try{
sock.close();;
}
catch(IOException e){
}
}
}class Send extends Thread
{
String SrvString;
PrintWriter pw;
BufferedReader bf;
Socket sock;
Send(Socket s){
sock=s;
SrvString=new String();
try{
bf= new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!SrvString.equals("88"))
{
try{
SrvString=bf.readLine();
System.out.println(SrvString);
pw.println("SREVER:"+SrvString);
}
catch(IOException e){
System.out.println("输入输出异常: 未发现服务端输出流!" + e.getMessage());
}
}
try{
sock.close();
}
catch(IOException e){
}
}
}
public class qqServer
{
public static void main(String args[]) //throws IOException
{ Socket server2 = null;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(1024);
}catch(IOException eq){
}
System.out.println("欢迎进入TESTQQ服务器端");
try{
while(true)
{
try{
server2 = serverSocket.accept();
}catch(IOException ew){
}
try{
new SocketThread(server2);
}catch(Exception ea){
System.out.println("多线程异常1!" + ea);
try{
server2.close();
}catch(IOException ez){
System.out.println("Socket关闭异常:" + ez);
}
}
}
}catch(Exception ed){
System.out.println("多线程异常2!");
}
finally{
try{
serverSocket.close();
}catch(IOException es){
System.out.println("ServerSocket关闭异常:" + es);
}
}
}
}///////////////////////////////////客户端代码///////////////////////////////////////////import java.net.*;
import java.io.*;class Recv extends Thread
{
String SrvString;
BufferedReader bf;
boolean done;
Socket sock;
Recv(Socket s)
{
sock=s;
done=true;
SrvString=new String();
try{
bf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!(SrvString.equals("88")))
{
try{
SrvString=bf.readLine();
System.out.println("CLIENT:"+SrvString);
}
catch(IOException e){
System.out.println("输入输出异常:" + e.getMessage());
}
}
try{
sock.close();
}
catch(IOException e){
}
}
}class Send extends Thread
{
String ClientString;
PrintWriter pw;
BufferedReader bf;
Socket sock;
Send(Socket s){
sock=s;
ClientString=new String();
try{
bf= new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!(ClientString.equals("88")))
{
try{
ClientString=bf.readLine();
pw.println("SREVER:"+ClientString);
}
catch(IOException e){
System.out.println("输入输出异常:" + e.getMessage());
}
}
try{
sock.close();
}catch(IOException e){
}
}
}
public class qqClient1
{
public static void main(String args[]) throws Exception
{
Socket client1 = null;
client1 = new Socket(InetAddress.getLocalHost(),1024);
Send send=new Send(client1);
Recv recv=new Recv(client1);
String ps = null;
String name = new String();
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
send.start();
recv.start();
while(true)
{
;
}
}
}
现在的问题是:服务端提示已连接,但是不能互相通信。
估计在把SOCKET对象传递到接收线程和发送线程时出现问题。望各位达人帮小弟看看!
/////////////////////////服务端代码////////////////////////////////////
import java.io.*;
import java.net.*;
class SocketThread extends Thread
{ Recv r;
Send send;
private Socket server1;
SocketThread(Socket s)
{
server1 = s;
r=new Recv(server1);
send=new Send(server1);
start();
}
public void run()
{
System.out.println("欢迎进入聊天室");
System.out.println(server1.getInetAddress().getHostAddress() + "已经连接!");
r.start();
send.start();
while(true){
;
}
}
}class Recv extends Thread
{
String ClientString;
BufferedReader bf;
boolean done;
Socket sock;
Recv(Socket s)
{
sock=s;
done=true;
ClientString=new String();
try{
bf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!ClientString.equals("88"))
{
try{
ClientString=bf.readLine();
System.out.println("CLIENT:"+ClientString);
}
catch(IOException e){
System.out.println("输入输出异常:未发现客户端输入流!" + e.getMessage());
}
}
try{
sock.close();;
}
catch(IOException e){
}
}
}class Send extends Thread
{
String SrvString;
PrintWriter pw;
BufferedReader bf;
Socket sock;
Send(Socket s){
sock=s;
SrvString=new String();
try{
bf= new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!SrvString.equals("88"))
{
try{
SrvString=bf.readLine();
System.out.println(SrvString);
pw.println("SREVER:"+SrvString);
}
catch(IOException e){
System.out.println("输入输出异常: 未发现服务端输出流!" + e.getMessage());
}
}
try{
sock.close();
}
catch(IOException e){
}
}
}
public class qqServer
{
public static void main(String args[]) //throws IOException
{ Socket server2 = null;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(1024);
}catch(IOException eq){
}
System.out.println("欢迎进入TESTQQ服务器端");
try{
while(true)
{
try{
server2 = serverSocket.accept();
}catch(IOException ew){
}
try{
new SocketThread(server2);
}catch(Exception ea){
System.out.println("多线程异常1!" + ea);
try{
server2.close();
}catch(IOException ez){
System.out.println("Socket关闭异常:" + ez);
}
}
}
}catch(Exception ed){
System.out.println("多线程异常2!");
}
finally{
try{
serverSocket.close();
}catch(IOException es){
System.out.println("ServerSocket关闭异常:" + es);
}
}
}
}///////////////////////////////////客户端代码///////////////////////////////////////////import java.net.*;
import java.io.*;class Recv extends Thread
{
String SrvString;
BufferedReader bf;
boolean done;
Socket sock;
Recv(Socket s)
{
sock=s;
done=true;
SrvString=new String();
try{
bf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!(SrvString.equals("88")))
{
try{
SrvString=bf.readLine();
System.out.println("CLIENT:"+SrvString);
}
catch(IOException e){
System.out.println("输入输出异常:" + e.getMessage());
}
}
try{
sock.close();
}
catch(IOException e){
}
}
}class Send extends Thread
{
String ClientString;
PrintWriter pw;
BufferedReader bf;
Socket sock;
Send(Socket s){
sock=s;
ClientString=new String();
try{
bf= new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
}
catch(IOException e){
}
}
public void run()
{
while(!(ClientString.equals("88")))
{
try{
ClientString=bf.readLine();
pw.println("SREVER:"+ClientString);
}
catch(IOException e){
System.out.println("输入输出异常:" + e.getMessage());
}
}
try{
sock.close();
}catch(IOException e){
}
}
}
public class qqClient1
{
public static void main(String args[]) throws Exception
{
Socket client1 = null;
client1 = new Socket(InetAddress.getLocalHost(),1024);
Send send=new Send(client1);
Recv recv=new Recv(client1);
String ps = null;
String name = new String();
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
send.start();
recv.start();
while(true)
{
;
}
}
}
import java.net.*;
import java.io.*;public class Servicer implements Runnable {
private Socket s;
public Servicer(Socket s){
this.s = s;
}
public void run(){
try{
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader( new InputStreamReader(ips));
PrintWriter pw = new PrintWriter(ops,true);
while(true){
String strLine = br.readLine();
if(strLine.equalsIgnoreCase("quit")){
TCPServerDemo.count--;
if(TCPServerDemo.count==0)
TCPServerDemo.bRunning = false;
break;
}
System.out.println(strLine+"From"+s.getInetAddress().toString()+":"+s.getPort());
String strEcho = (new StringBuffer(strLine).reverse()).toString();
pw.println(strLine +"------>"+strEcho);
}
br.close();
pw.close();
s.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}-------------import java.net.*;
import java.io.IOException;
public class TCPServerDemo {
static int count=0;
static boolean bRunning = true;
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(8003);
//boolean bRunning = true;
while(bRunning){
Socket s = ss.accept();
if(s!=null)
count++;
new Thread( new Servicer(s)).start();
}
ss.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}运行后,可以执行telnet 127.0.0.1 8003与程序通信!同时可再打开cmd窗口,再输入
telnet 127.0.0.1 8003 两个通信互不干扰!