Java Socket网络编程,你要的实验,我都有

JAVA Socket编程

多人聊天室

客户端源代码


import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/*客户端窗口构建*/
public class ClientChatView extends JFrame{
   
	//显示文本的窗口
	private JTextArea ta = new JTextArea(10,20);
	//输入文本的窗口
	private JTextField tf = new JTextField(20);
	
	//创建客户端socket
	private Socket cs = null;
	//指定客户端socket端口
	private static final int PORT = 8888;
	//指定客户端socket的ip地址
	private static final String CONNSTR = "127.0.0.1";
	//网络输出流
	private DataOutputStream dos = null;
	private boolean isconn = false;
	
	//ClientChatView构造方法
	public ClientChatView() throws HeadlessException {
   
		super();
	}
	//ClientChatView初始化方法
	public void init() {
   
		//设置窗口标题
		this.setTitle("ClientView");
		//设置窗口样式
		this.add(ta,BorderLayout.CENTER);
		this.add(tf,BorderLayout.SOUTH);
		//设置窗口总大小
		this.setBounds(300, 300, 300, 400);
		//关闭上边窗口输入功能
		ta.setEditable(false);
		//光标聚焦
		tf.requestFocus();
		//点击窗口叉号=关闭客户端
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//监听tf输入到ta,并清除掉tf中内容
		tf.addActionListener(new ActionListener() {
   
			public void actionPerformed(ActionEvent e) {
   
				//获取tf中输入的信息
				String strSend = tf.getText();
				//使用send方法发送信息给服务器端
				send(strSend);
				if (strSend.trim().length()==0) {
   
					return;//tf中没有输入
				}
				tf.setText("");
				//加入到ta中
				//ta.append(strSend+"\n");
			}
		});
		
		
		//正式创建客户端Socket
		/*try catch处理异常*/
		try {
   
			cs = new Socket(CONNSTR,PORT);
			isconn = true;
		} catch (UnknownHostException e1) {
   
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
   
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		this.setVisible(true);
		new Thread(new Receive()).start();
	}
	
	//发送信息到服务器上的方法
	public void send(String str) {
   
		try {
   
			//使用socket的getinputstream方法获取网络字节输入流对象
			dos = new DataOutputStream(cs.getOutputStream());
			//将输出流信息发送给服务器
			dos.writeUTF(str);
		} catch (IOException e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	//多线程的类,实现多线程接收
	class Receive implements Runnable{
   
		public void run() {
   
			try {
   
				while(isconn) {
   
					DataInputStream dis = new DataInputStream(cs.getInputStream());
					String str = dis.readUTF();
					ta.append(str);
				}
			}catch (SocketException e3) {
   
				System.out.println("Sever stopped");
				ta.append("Server stopped");
			} 
			catch (IOException e) {
   
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
   
		ClientChatView cc = new ClientChatView();
		cc.init();
	}
}

服务器端源代码


import java.awt.BorderLayout;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionEvent;

//服务器窗口创建
/*一个框框,两个按钮*/
public class ServerChat extends JFrame{
   
	//设置服务器窗口——一个框框
	JTextArea serverTa = new JTextArea();
	//创建服务器窗口——两个按钮
	private JPanel btnTool = new JPanel();
	private JButton starBtn = new JButton("start");
	private JButton stopBtn = new JButton("stop");
	
	//设置服务器端socket的端口号
	private static final int PORT = 8888;
	//创建服务器端socket
	private ServerSocket ss = null;
	private Socket s = null;
	//设置服务器启动的标志
	private boolean isStart = false;
	//设置连接到服务器上的客户socket数组
	private ArrayList<ClientConn> cclist=new ArrayList<ClientConn>();
	//初始化服务器窗口
	public void init() {
   
		//设置窗口标题
		this.setTitle("ServerView");
		//设置窗口样式
		this.add(serverTa,BorderLayout.CENTER);
		btnTool.add(starBtn);
		btnTool.add(stopBtn);
		this.add(btnTool,BorderLayout.SOUTH);
		//设置窗口总大小
		this.setBounds(0, 0, 500, 500);
		//设置serverTa不可输入
		serverTa.setEditable(false);
		//点击叉号关闭窗口,同时停止服务器运行,后面改进
		//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//判断服务器是否启动
		if(isStart) {
   
			serverTa.append("Server started.\\n");
		}else {
   
			serverTa.append("Server not start."+"\n");
		}
		//监听开始按钮,启动服务器
		starBtn.addActionListener(new ActionListener() {
   
			public void actionPerformed(ActionEvent e) {
   
				try {
   
					if(ss==null) {
   
						ss=new ServerSocket(PORT);
					}
					isStart = true;
					serverTa.append("Server started."+"\n");
				}catch(IOException e1) {
   
					e1.printStackTrace();
				}
				
						
			}
				
		});
		//监听停止按钮,关闭服务器
		stopBtn.addActionListener(new ActionListener() {
   
			public void actionPerformed(ActionEvent e) {
   
				//关机
				isStart = false;
				try {
   
					if(s!=null) {
   
						s.close();
					}
					if(ss!=null) {
   
						ss.close();
					}
					serverTa.append("Server stopped");
					System.exit(0);
				} catch (IOException e1) {
   
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		//监听窗口(叉号)
		this.addWindowListener(new WindowAdapter() {
   
			public void windowClosing(WindowEvent e) {
   
				//关机
				isStart = false;
				try {
   
					if(s!=null) {
   
						s.close();
					}
					if(ss!=null) {
   
						ss.close();
					}
					serverTa.append("Server stopped");
					System.exit(0);
				} catch (IOException e1) {
   
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		this.setVisible(true);
		
		startServer();
		
		
	}
	
	/*服务器启动方法*/
	public void startServer() {
   
		//正式创建服务器socket
		try {
   
			try {
   
				ss = new ServerSocket(PORT);
				isStart = true;
			} catch (IOException e) {
   
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//只要服务器运行就一直等待客户连接,接受多个客户端连接
			while (isStart) {
   
				//获取客户端socket对象
				s = ss.accept
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值