Javase网络通讯(socket编程)群聊系统
2016-05-12 08:26
633 查看
Server:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/* 实现局域网的群聊系统
* 1.要求能够实现多人在同一个界面上群聊
* 2.写一个登录界面
* 3.按个enter可以发送消息
*
* */
public class Server
{
public static void main(String[] args) throws Exception
{
//用来存储连接的客户端
ArrayList<Socket> al=new ArrayList<Socket>();
ServerSocket server=new ServerSocket(3333);
//死循环,无限监听连接到此服务器端的客户端
while(true)
{
Socket socket=server.accept();
al.add(socket);//有连接的客户端,就将该客户端保存在集合类中
new ServerThread(socket,al).start();
}
}
}
ServerThread服务器端线程:
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket=new Socket(InetAddress.getByName("192.168.1.240"),3333);
String name=JOptionPane.showInputDialog("请输入用户名:");
new MyFrame(socket,name);
}
}ClientThread 客户端线程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ClientThread extends Thread
{
Socket socket;
MyFrame mf;
public ClientThread(Socket socket, MyFrame mf)
{
this.socket = socket;
this.mf = mf;
}
public void run()
{
try
{
//获得客户端的输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
//获得从服务器输入的信息
String message=br.readLine();
//将信息输入到文本域中
mf.area.setText(mf.area.getText()+"\n"+message);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}MyFrame前台界面框架:
import java.awt.BorderLayout;
import java.awt.Container;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MyFrame
{
Socket socket;
JTextField field;
JTextArea area;
JFrame frame;
public MyFrame(Socket socket,String name)
{
this.socket=socket;
frame=new JFrame(name);
Container con=frame.getContentPane();
con.setLayout(new BorderLayout());
JPanel p=new JPanel();
area=new JTextArea(20,20);
p.add(area);
con.add(p,BorderLayout.CENTER);
JPanel pan=new JPanel();
field=new JTextField(15);
JButton btn=new JButton("发送");
pan.add(field);
pan.add(btn);
MyListener ml=new MyListener(socket, this);
new ClientThread(socket, this).start();
btn.addActionListener(ml);
con.add(pan, BorderLayout.SOUTH);
frame.setSize(250, 250);
frame.setVisible(true);
}
}
MyListener 监听:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MyListener implements ActionListener
{
Socket s;
MyFrame mf;
public MyListener(Socket s, MyFrame mf)
{
this.s = s;
this.mf = mf;
}
@Override
public void actionPerformed(ActionEvent e)
{
String str=e.getActionCommand();
System.out.println(str);
if(str.equals("发送"))
{
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
————————————————————————————————
额外:
1 如果自己写窗口实现登陆,然后跳转第二个窗口。前一个窗口貌似只能隐藏,不能关闭,可以用jframe.dispose()来隐藏窗口释放资源;System.exit(0),全部退出
2 按回车键实现发送,添加监听:
if(e.getKeyCode() == KeyEvent.VK_ENTER) //判断按下的键是否是回车键
{
String str=mf.field.getText();
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
e1.printStackTrace();
}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/* 实现局域网的群聊系统
* 1.要求能够实现多人在同一个界面上群聊
* 2.写一个登录界面
* 3.按个enter可以发送消息
*
* */
public class Server
{
public static void main(String[] args) throws Exception
{
//用来存储连接的客户端
ArrayList<Socket> al=new ArrayList<Socket>();
ServerSocket server=new ServerSocket(3333);
//死循环,无限监听连接到此服务器端的客户端
while(true)
{
Socket socket=server.accept();
al.add(socket);//有连接的客户端,就将该客户端保存在集合类中
new ServerThread(socket,al).start();
}
}
}
ServerThread服务器端线程:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.ArrayList; public class ServerThread extends Thread { Socket s; ArrayList<Socket> al; public ServerThread(Socket s, ArrayList<Socket> al) { this.s = s; this.al = al; } public void run() { try { BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); while(true) { String message=br.readLine();//获取从客户端读取的信息 //遍历集合类,将消息转发到集合类中所有的客户端 for(Socket socket:al) { //获得集合类中单个客户端的输出流 PrintWriter pw=new PrintWriter(socket.getOutputStream()); pw.println(message);//将消息打印到输出流中 pw.flush(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }Client客户端开始界面:
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket=new Socket(InetAddress.getByName("192.168.1.240"),3333);
String name=JOptionPane.showInputDialog("请输入用户名:");
new MyFrame(socket,name);
}
}ClientThread 客户端线程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ClientThread extends Thread
{
Socket socket;
MyFrame mf;
public ClientThread(Socket socket, MyFrame mf)
{
this.socket = socket;
this.mf = mf;
}
public void run()
{
try
{
//获得客户端的输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
//获得从服务器输入的信息
String message=br.readLine();
//将信息输入到文本域中
mf.area.setText(mf.area.getText()+"\n"+message);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}MyFrame前台界面框架:
import java.awt.BorderLayout;
import java.awt.Container;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MyFrame
{
Socket socket;
JTextField field;
JTextArea area;
JFrame frame;
public MyFrame(Socket socket,String name)
{
this.socket=socket;
frame=new JFrame(name);
Container con=frame.getContentPane();
con.setLayout(new BorderLayout());
JPanel p=new JPanel();
area=new JTextArea(20,20);
p.add(area);
con.add(p,BorderLayout.CENTER);
JPanel pan=new JPanel();
field=new JTextField(15);
JButton btn=new JButton("发送");
pan.add(field);
pan.add(btn);
MyListener ml=new MyListener(socket, this);
new ClientThread(socket, this).start();
btn.addActionListener(ml);
con.add(pan, BorderLayout.SOUTH);
frame.setSize(250, 250);
frame.setVisible(true);
}
}
MyListener 监听:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MyListener implements ActionListener
{
Socket s;
MyFrame mf;
public MyListener(Socket s, MyFrame mf)
{
this.s = s;
this.mf = mf;
}
@Override
public void actionPerformed(ActionEvent e)
{
String str=e.getActionCommand();
System.out.println(str);
if(str.equals("发送"))
{
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
————————————————————————————————
额外:
1 如果自己写窗口实现登陆,然后跳转第二个窗口。前一个窗口貌似只能隐藏,不能关闭,可以用jframe.dispose()来隐藏窗口释放资源;System.exit(0),全部退出
2 按回车键实现发送,添加监听:
if(e.getKeyCode() == KeyEvent.VK_ENTER) //判断按下的键是否是回车键
{
String str=mf.field.getText();
try
{
//获得客户端的输出流
PrintWriter pw=new PrintWriter(s.getOutputStream());
//将文本行中的信息打印到客户端的输出流中
pw.println(mf.frame.getTitle()+"::"+mf.field.getText());
pw.flush();
mf.field.setText("");
} catch (IOException e1)
{
e1.printStackTrace();
}
}
相关文章推荐
- AESwithJCE http://www.coderanch.com/how-to/content/AES_v1.html
- TCP四步挥手的各种状态转换图
- bp神经网络及matlab实现
- Laxcus大数据管理系统2.0(8)- 第六章 网络通信
- 云计算:创业的好时机——上海够快网络科技有限公司总经理蒋烁淼专访(评价阿里云的OSS的4个优点)(够快科技正式宣布已成功挂牌新三板)
- Request.Path HttpRequest.ValidateInputIfRequiredByConfig() 异常
- NetAnalyzer笔记 之 九 使用C#对HTTP数据还原
- Android入门之网络图片查看器
- Wireshark抓包示范:TCP三次握手建立连接和四次握手断开连接
- C#网络示例
- Okhttp post请求
- Java---网络编程(4)-C/S-B/S
- Java---网络编程(4)-C/S-B/S
- lucene学习001
- 抓取HTTPS 协议的程序报错
- 11个可以帮你增长网络社交粉丝的技巧
- ACM网络流入门
- CentOS IP丢失,切换了网络连接导致的vmnet8未启用dhcp
- Servlet/JSP-03 HttpServlet
- Windows网络编程学习笔记(3) 编写一个TCP服务端