刚接触java网络编程,实现了利用socket多线程局域网聊天工具。先由客户端发送数据给服务器,然后由服务器把数据写入流中,发送到各个客户端中,主要涉及的技术是socket的应用,多线程的应用以及各个流过滤的应用编写。大家可以参考一下,不足之处,多多指教。
服务器:
package sockettest;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.UID;
import java.sql.Connection;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import second.third;
public class ServerUI {
public static int num=0;
public static Socket[] sockets=new Socket[100];
public static void main(String[] args) throws Exception
{
// ServerUI serverUI=new ServerUI();
ServerSocket soc=new ServerSocket(9999);
while (true) {//服务器一直处于开启状态,每个客户端都有一个线程产生
Socket socket=soc.accept();
sockets[num++]=socket;
new serverchat(socket).start();
}
}
}
class serverchat extends Thread{
Socket socket;
public serverchat(Socket socket)
{
this.socket=socket;
}
public void run(){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientString=null;
while ( (clientString=in.readLine()) !=null) {
for(int i=0;i<ServerUI.num;i++)//遍历所有与服务器链接的客户端
{
System.out.println(clientString+"\n");
PrintStream printStream=new PrintStream(ServerUI.sockets[i].getOutputStream());
printStream.println(clientString);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package sockettest;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import second.third;
public class ClientUI extends JFrame implements ActionListener {
JTextArea mainArea=new JTextArea(10,30);
JTextField sendField=new JTextField(30);
JTextField ipField=new JTextField(10);
JTextField portField=new JTextField(10);
JButton linkbButton;
Socket socket;
int flag=0;
public ClientUI() throws Exception {
super("客户端");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,300);
setLayout(new BorderLayout());
JPanel panel=new JPanel(new FlowLayout());
JLabel label=new JLabel("IP:");
JLabel label2=new JLabel("PORT:");
linkbButton=new JButton("connect!");
ipField.setText("127.0.0.1");
portField.setText("9999");
panel.add(label);
panel.add(ipField);
panel.add(label2);
panel.add(portField);
panel.add(linkbButton);
linkbButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(ipField.getText().equals("127.0.0.1")&&portField.getText().equals("9999"))
flag=1;
else {
flag=0;
}
}
});
JPanel panel2=new JPanel(new FlowLayout());
JButton button=new JButton("ok");
panel2.add(new JLabel("input:"));
panel2.add(sendField);
panel2.add(button);
add(panel,BorderLayout.NORTH);
add(mainArea,BorderLayout.CENTER);
add(panel2,BorderLayout.SOUTH);
setVisible(true);
socket=new Socket("218.192.102.210",9999);
new clientchat(socket).start();
final PrintStream socketstream=new PrintStream(socket.getOutputStream());
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String inputString=sendField.getText().trim();
if(inputString.length()>0)
socketstream.println(inputString);
sendField.setText("");
}
});
}
public static void main(String[] args) throws Exception
{
ClientUI clientUI=new ClientUI();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
class clientchat extends Thread{
Socket socket;
public clientchat(Socket socket)
{
this.socket=socket;
}
public void run(){
try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));){
String line;//从网络上来读取socket的值,打印在text上
while ((line=br.readLine())!=null) {
System.out.println(line+"\n");
mainArea.append(line+"\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}