socket通信简易聊天室

socket通信简易聊天室

实现的功能通信、清屏、记录和窗口震动。

public class GuiChat {
	private JTextField jt;
	private JButton send;
	private JButton log;
	private JButton clean;
	private JButton shack;
	private TextArea ja;
	private TextField ja1;
	private DatagramSocket socket;
	private BufferedWriter bw;
	private JFrame frame;
	private JLabel sends,receive,bel;
	public GuiChat() {
		init();		
	}
	public void init() {
		frame = new JFrame();
		frame.setSize(500, 600);
		frame.setLocation(500, 50);
		try {
			socket = new DatagramSocket();
		} catch (SocketException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		new Receive().start();
		File f = new File("log.txt");
		try {
			bw = new BufferedWriter(new FileWriter(f,true));
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Panel p = new Panel();
		Panel p1 = new Panel();
		jt = new JTextField(10);
		jt.setText("127.0.0.1");
		send = new JButton("发 送");
		log = new JButton("记 录");
		clean = new JButton("清 除");
		shack = new JButton("震 动");
		bel = new JLabel("ip地址:");
		Panel panel1=new Panel();
		panel1.add(new JLabel("当前机器的IP地址是:"));
		try {
			panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));
		} catch (UnknownHostException e) {
			panel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));
		}
		p1.add(panel1);
		p1.add(bel);
		p1.add(jt);
		p.add(send);
		p.add(log);
		p.add(clean);
		p.add(shack);
		send.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				send();
			}
		});
		log.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				log();
			}
		});
		clean.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				ja.setText("");
			}
		});
		shack.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				send(new byte[] {-1},jt.getText());
			}
		});
		frame.add(p1, BorderLayout.NORTH);
		frame.add(p, BorderLayout.SOUTH);
		Panel s = new Panel();
		Panel p2 = new Panel();
		sends = new JLabel("收到的内容:");
		receive = new JLabel("发送的内容:");
		receive.setFont(new Font("黑体", Font.BOLD, 15));
		sends.setFont(new Font("黑体", Font.BOLD, 15));
		ja = new TextArea();
		ja1 = new TextField(30);
		ja1.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				if(e.getKeyCode()==KeyEvent.VK_ENTER) {
					send();
				}
			}
		});
		ja.setEditable(false);
		ja.setBackground(Color.WHITE);
		ja.setFont(new Font("黑体", Font.BOLD, 20));
		ja1.setFont(new Font("黑体", Font.BOLD, 20));
		s.setLayout(new BorderLayout());
		s.add(sends,BorderLayout.NORTH);
		p2.add(receive,BorderLayout.NORTH);
		p2.add(ja1, BorderLayout.CENTER);
		s.add(ja, BorderLayout.CENTER);
		s.add(p2, BorderLayout.SOUTH);
		frame.add(s, BorderLayout.CENTER);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				socket.close();
				try {
					bw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				System.exit(0);
			}
		});
		frame.setVisible(true);		
	}
	private void shack() {
		// TODO Auto-generated method stub
		int x = frame.getLocation().x;
		int y = frame.getLocation().y;
		for (int i = 0; i < 10; i++) {
			try {
				frame.setLocation(x+20, y+20);
				Thread.sleep(20);
				frame.setLocation(x+20, y-20);
				Thread.sleep(20);
				frame.setLocation(x-20, y+20);
				Thread.sleep(20);
				frame.setLocation(x-20, y-20);
				Thread.sleep(20);
				frame.setLocation(x, y);			
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}	
	}
	public void send(byte[] arr,String ip) {
		DatagramPacket packet;
		try {
			packet = new DatagramPacket(arr,arr.length, InetAddress.getByName(ip),6666);
			socket.send(packet);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void send() {
		String str = ja1.getText();
		String ip = jt.getText();
		ip = ip.trim().length()==0?"255.255.255.255":ip;
		try {
			send(str.getBytes(),ip);
			String time = ctime();
			String string = time+"我对:"+ip+"说:"+"\r\n"+str+"\r\n\r\n";
			ja.append(string);
			bw.write(string);
			ja1.setText("");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
	public void log() {
		try {
			bw.flush();
			FileInputStream fis = new FileInputStream("log.txt");
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int len;
			byte[] arr = new byte[8129];
			while((len=fis.read(arr))!=-1) {
				baos.write(arr,0,len);
			}
			String str = baos.toString();
			ja.setText(str);
			fis.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private class Receive extends Thread {
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(6666);
				DatagramPacket packet = new DatagramPacket(new byte[8192], 8192);
				while(true) {
					socket.receive(packet);
					byte[] arr = packet.getData();
					int len = packet.getLength();
					if(arr[0]==-1&&len==1) {
						shack();
						continue;
					}
					String ip = packet.getAddress().getHostName();
					String str = new String(arr,0,len);
					String time = ctime();
					String string = time+" "+ip+"对我说\r\n"+str+"\r\n\r\n";
					ja.append(string);
					bw.write(string);
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public String ctime() {
		Date data = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return df.format(data);
	}
	public static void main(String[] args) {
		new GuiChat();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值