关于 JAVA的控制台聊天程序

现在遇到了困难:我是用JAVA编写的。因为程序获取用户输入数据这个函数是阻塞函数,所以,程序不得不等待用户的输入后,才能执行下一步,这就导致了就算服务端发送了数据,也不能接受!!另外,接受服务端的数据的函数也是个阻塞函数,同样有这样的问题!
我现在想要实现这样的效果:用户的输入和接受数据不受到阻塞函数的影响!可以方便的发送和接收!
根据问题我写的代码:
服务端:
ContractedBlock.gif ExpandedBlockStart.gif Code
package chen.chat;
import java.io.
*;
import java.net.
*;
public class Server
{
    
public static void main(String [] agrs)
    {
        
try
        {
            ServerSocket server
=new ServerSocket(4000);
            System.
out.println("服务器开启");
            
while(true)
            {
                Socket client
=server.accept();
                
try
                {
                    System.
out.println("客户已经连接到服务器");
                    System.
out.println("IP:"+client.getInetAddress().getHostAddress()+"Port: "+client.getPort());
                    
new ServerThread(client).start();
                }
                
catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
        
catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}
class ServerThread extends Thread
{
    
private Socket client ;
    
private BufferedReader bfSystemInput;
    
private BufferedReader bfSocketInput;
    
private PrintWriter outer;
    
public ServerThread(Socket socket)
    {
        
try
        {
            
this.client=socket;
            
this.bfSystemInput=new BufferedReader(new InputStreamReader(System.in));
            
this.bfSocketInput=new BufferedReader(new InputStreamReader(this.client.getInputStream()));
            
this.outer=new PrintWriter(this.client.getOutputStream());
        }
        
catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    
public void run()
    {
        ListernerSystem lstSocket
=new ListernerSystem(this.bfSocketInput);
        ListenerSystem lstSystem
=new ListenerSystem(this.bfSystemInput,this.outer);
        lstSocket.start();
        lstSystem.start();
    }
}
class ListernerSystem extends Thread
{
    
private BufferedReader bfSocketInput;
    
public ListernerSystem(BufferedReader bf)
    {
        
this.bfSocketInput=bf;
    }
    
public void run()
    {
        
while(true)
        {
            String msg
=null;
            
try
            {
                
if((msg=bfSocketInput.readLine())!=null)
                {
                    System.
out.println("Your friend say: "+msg);
                    
                }
                
else
                {
                    System.
out.println("dsa");
                }
            }
            
catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
class ListenerSystem extends Thread
{
    
private BufferedReader bfSystemInput;
    
private PrintWriter outer;
    
public ListenerSystem(BufferedReader bf,PrintWriter out)
    {
        
this.bfSystemInput=bf;
        
this.outer=out;
    }
    
public void run()
    {
        
while(true)
        {
            
try
            {
                String msg
=null;
                
if((msg=bfSystemInput.readLine())!=null)
                {
                    
this.outer.println("You Say: "+msg);
                }
                
else
                {
                    System.
out.println("dsa");
                }
            }
            
catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
客户端:
ContractedBlock.gif ExpandedBlockStart.gif Code
package chen.chat;
import java.io.*;
import java.net.*;
public class Client
{
    
public static void main(String [] agrs)
    {
        
try
        {
            Socket client
=new Socket("127.0.0.1",4000);
            System.out.println(
"连接服务器成功");
            BufferedReader bfSystemInput
=new BufferedReader(new InputStreamReader(System.in));
            BufferedReader bfSocketInput
=new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out
=new PrintWriter(client.getOutputStream());
            
new ListenSocket(bfSocketInput).start();
            
new ListenControlInput(bfSystemInput,out).start();
        }
        
catch(UnknownHostException e)
        {
            e.printStackTrace();
        }
        
catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}
class ListenSocket extends Thread
{
    
private BufferedReader bfSocketInput;
    
public ListenSocket(BufferedReader bf)
    {
        
this.bfSocketInput=bf;
    }
    
public void run()
    {
        
while(true)
        {
            String msg
=null;
            
try
            {
                
if((msg=bfSocketInput.readLine())!=null)
                {
                    System.out.println(
"Your friend say: "+msg);
                }
            }
            
catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
class ListenControlInput extends Thread
{
    
private BufferedReader bfSystemInput;
    
private PrintWriter out;
    
public ListenControlInput(BufferedReader bf,PrintWriter out)
    {
        
this.bfSystemInput=bf;
        
this.out=out;
    }
    
public void run()
    {
        String msg
=null;
        
while(true)
        {
            
try
            {
                msg
=this.bfSystemInput.readLine();
                
if(msg!=null)
                    
this.out.println("You Say: "+msg);
            }
            
catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
执行后,客户端或者服务端并不会接收到数据。
我将发送数据和接收数据 分开写入一个线程里面了。
大虾帮忙看下。。。小弟忙活2天了。。。

转载于:https://www.cnblogs.com/ChinaPgm/archive/2009/08/31/1557603.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值