Socket编程 基本的聊天实现。

public class Server
{

//用来存储所有连接上来的客户
private List<ServerThread> clients;

public static void main(String[] args)
{
Server s = new Server();
s.startServer(9988);
}

public void startServer(int port)
{
ServerSocket ss = null;
Socket socket = null;
try
{
ss = new ServerSocket(port);
clients=new ArrayList<ServerThread>();
while (true)
{
System.out.println("waiting...");
socket = ss.accept();
ServerThread st = new ServerThread(socket);
new Thread(st).start();
}
}
catch (IOException e)
{

e.printStackTrace();
}
finally
{
SocketUtils.closeSocketServer(ss);

}
}

private class ServerThread implements Runnable
{

private Socket s = null;
private BufferedReader br;
private PrintWriter out;
private String address;
private String username;

private boolean flag;

public ServerThread(Socket s) throws IOException
{
this.s = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
out = new PrintWriter(s.getOutputStream(),true);

username=br.readLine();
System.out.println("username="+username);

address = s.getInetAddress().getHostAddress() + ":" + s.getPort();
// System.out.println(name + "连接上来了");
clients.add(this);
send(username+"上线了");
}

private void stop()
{
System.out.println(username+"已经离开了");
clients.remove(this);
flag = false;
}


/**
* 接收用户的信息
*/
private void receive()
{
String str = null;
try
{
while ((str = br.readLine()) != null)
{
if (str.equalsIgnoreCase("quit"))
{
// 关闭
stop();
out.println("disconnect");
break;
}

String sendMsg=username+":"+str;

// out.println(username+":"+ str);

//给所有的用户发送信息
send(sendMsg);

System.out.println("out");
}
}
catch (IOException e)
{
stop();
System.out.println("用户非正常死亡->"+username);
}finally{
SocketUtils.closeSocket(s);
}
}


/**
* 给用户发信息
* @param msg
*/
private void send(String msg){
for(ServerThread st:clients){
st.out.println(msg);
}
}


public void run()
{
// if(!flag)break;
receive();

}

}

}



public class Client
{

private Socket s;
private BufferedReader br;
private PrintWriter out;

private boolean flag=true;

public static void main(String[] args)
{
Client c=new Client();
// c.sendMessage();
c.startup();
}


public void startup(){
BufferedReader sbr=null;

try
{
s=new Socket("127.0.0.1",9988);
//s=new Socket("115.28.240.213",9988);
out=new PrintWriter(s.getOutputStream(),true);
out.println("myname");
br=new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));

sbr=new BufferedReader(new InputStreamReader(System.in));
new Thread(new ClientThread()).start();
String str=null;

while((flag)&&(str=sbr.readLine())!=null){
if(!flag)break;
String msg=new String(str.getBytes("gbk"),"utf-8");
out.println(msg);
}

}
catch (UnknownHostException e)
{

e.printStackTrace();
}
catch (IOException e)
{

e.printStackTrace();
}
}




private void closeSocket(Socket s){
if(s!=null){
try
{
s.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

private void receive(){
try
{
String rs=br.readLine();
if(rs.equalsIgnoreCase("disconnect")){
flag=false;
System.out.println("按回车退出");
return ;
}
System.out.println(rs);
}
catch (IOException e)
{

e.printStackTrace();
}
}


private class ClientThread implements Runnable{



@Override
public void run()
{
while(true){
if(!flag)break;
receive();
}
}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值