利用网络编程实现聊天程序

实现聊天窗口界面

package wlbc;

import java.net.*;
import java.util.Scanner;

public class Ch01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入连天服务器当前启动端口号:");
		int serverport = sc.nextInt();
		System.out.println("请输入聊天服务发送信息对象的目标端口号:");
		int targetport = sc.nextInt();
		System.out.println("聊天系统初始化完成并启动!");
		try {
			//创建聊天程序收发平台 DatagramSocket对象
			DatagramSocket Socket = new DatagramSocket(serverport);
			//分别启动信息接收端和发送端程序
			new Thread(new ChatReceiver(Socket),"接收服务").start();
			new Thread(new ChatSend(Socket,targetport),"发送服务").start();
		}catch(SocketException e) {
			e.printStackTrace();
		}

	}

}

双方端口号必须相反且相同,且发送消息的服务端必须明确知道消息发送的目的地,即IP地址和端口号,同时一个聊天对象启动的程序服务既可以作为接收端也可以作为消息发送端。

实现聊天程序接收功能

package wlbc;

import java.net.*;

public class ChatReceiver implements Runnable {
	//聊天程序收发平台 DatagramSocket对象
	private DatagramSocket server;
	public ChatReceiver(DatagramSocket server) {
		this.server=server;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			//创建Datagrampacket数据包接收对象
			byte[] buf = new byte[1024];
			DatagramPacket packet = new DatagramPacket(buf,buf.length);
			while(true) {
				server.receive(packet);
				//显示并打印聊天信息
				String str = new String(packet.getData(),0,packet.getLength());
				System.out.println("收到"+packet.getAddress()+":"+packet.getPort()+"发送的数据:"+str);
				
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

声明了一个DatagramSocket类型的server变量来表示聊天程序信息收发平台,并通过该类的构造方法获取具体的DatagramSocket实例对象,在run()方法中,通过while循环方法来持续接收发送到该DatagramSocket平台的信息,最后通过输出语句来显示接收到的聊天信息。

实现聊天程序信息发送功能

package wlbc;

import java.net.*;
import java.util.Scanner;

public class ChatSend implements Runnable {
	//聊天程序信息发送平台 DatagramSocket对象
	private DatagramSocket client;
	//聊天对象的程序所在的服务端口号
	private int targetport;
	public ChatSend(DatagramSocket client,int targetport) {
		this.client=client;
		this.targetport=targetport;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			//书并获取键盘要发送的聊天信息
				Scanner sc = new Scanner(System.in);
				while(true) {
					String data = sc.nextLine();
					//封装数据到DatagramPacket数据包发送对象中
					byte[] buf = data.getBytes();
					DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),targetport);
					client.send(packet);
					
				}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

分别声明了名称为client和targetport的变量来表示聊天程序信息发送平台和要发送聊天信息的目标端口号,并通过该类的构造方法获取具体的DatagramPacket实例对象。在run()方法中,通过Scanner对象和循环方法获取键盘输入的聊天信息,接下来将获取到的数据封装到DatagramPacket对象中,最后通过DatagramPacket对象的send()方法发送数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值