把收发线程独立出去——单独写成一个类 ,只创立server一个图形界面 用于个体的可视化操作 配合swing可以极大模仿聊天个人界面
sendThread:
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class sendThread extends Thread{
public Socket s;
public sendThread(Socket s)
{
this.s=s;
}
@Override
public void run() {
try {
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true){
Scanner sc = new Scanner(System.in);
String str = sc.next();
dos.writeUTF(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
receiveThread:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class receiveThread extends Thread{
private Socket s;
public receiveThread(Socket s)
{
this.s=s;
}
@Override
public void run() {
try {
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
while (true) {
String msg = dis.readUTF();
System.out.println(msg);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Client:
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args){
try {
InetAddress i=InetAddress.getLocalHost();
String st=i.getHostAddress();
Socket s=new Socket(st,8888);
new sendThread(s).start();
new receiveThread(s).start();
}catch (UnknownHostException e)
{
e.printStackTrace();
}catch (IOException e)
{
System.out.println("对方已下线");
e.printStackTrace();
}
}
}
server:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static ServerSocket se;
static Socket s;
public static void main(String[] args) {
JFrame f=new JFrame("server");
f.setLocation(400,500);
f.setSize(600, 650);
JButton b1=new JButton("send");
b1.setBounds(20,20,100,30);
JTextArea ja=new JTextArea();
ja.setLineWrap(true);//将参数设为true自动换行
//如果是想每一次输入都是换行的话,那就在在上一次输入的最后加一个"\r\n"
//调节JTextArea的字体大小
Font font=new Font("Default",Font.PLAIN,29);
ja.setFont(font);
ja.setSize(new Dimension(400,400));
ja.setLocation(0,0);
JTable jt=new JTable();
jt.add(ja);//把文本域加入到表组件中 为使自动更新聊天内容
jt.setLocation(150, 20);
jt.setSize(new Dimension(400,500));
JTextField jf=new JTextField();
jf.setLocation(20,80);
jf.setSize(new Dimension(100,50));
try {
ServerSocket ss=new ServerSocket(8888);
System.out.println("监听在端口号:8888");
Socket s=ss.accept();
InputStream is= s.getInputStream();
DataInputStream dis= new DataInputStream(is);
OutputStream os=s.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
//接收
Thread t1=new Thread() {
public void run() {
//线程的While(true)里面放要循环的内容需要不停执行的内容,不需要不停执行的不必放
//按钮监听了发送,不需要发送线程了
while(true) {
try {
String s=dis.readUTF();
if(s!="") {
ja.append("client:"+s+"\r\n");
jt.updateUI();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}; t1.start();
b1.addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent e) {
String s=jf.getText();
jf.setText(null);
//发送
try {
dos.writeUTF(s);ja.append("server:"+s+"\r\n");jt.updateUI();
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
});
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
f.add(b1);
f.add(jf);
f.add(jt);
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
一开始server的部分代码是准备利用receiveThread和sendThread这两个已有的线程的 起初用重载构造方法以为可以解决 之后发现run方法只能执行一种 其结果就是异常中断
也算是一个小项目 知道实现的过程中可以多新建类来实现 把整个功能代码模块化 server要实现图形界面可以另写 client就利用现有的两个收发线程。