Java之------socket系列(三)

练习:UDP聊天程序

通过键盘录入获取要发送的信息。

将发送和接收分别封装到两个线程中。

聊天方一:

<span style="font-size:14px;">package cn.hncu.url.udp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

import com.sun.imageio.plugins.common.InputStreamAdapter;

public class UDPChat {

	public static void main(String[] args) {
		try {
			DatagramSocket send=new DatagramSocket(10001);
			DatagramSocket receive=new DatagramSocket(10002);

			new Thread(new Send(send)).start();
			new Thread(new Receive(receive)).start();
		} catch (SocketException e) {
			e.printStackTrace();
		}

	}
}

class Send implements Runnable{
	private DatagramSocket ds=null;
	public Send(DatagramSocket ds){
		this.ds=ds;
	}

	@Override
	public void run() {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line=null;
		try {
			while ((line=br.readLine())!=null){
				byte buf[]=line.getBytes();
				//下面的ip地址我用xxx.xxx.xxx.xxx表示,这里要使用你自己的ip地址,运行时记得改过来
				DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">xxx.xxx.xxx.xxx</span></span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">"),10004);</span></span><span style="font-size:14px;">
				ds.send(dp);
				if (line.equalsIgnoreCase("over")){
					break;
				}
			}
//			ds.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

class Receive implements Runnable{
	private DatagramSocket ds=null;
	public Receive(DatagramSocket ds){
		this.ds=ds;
	}

	@Override
	public void run() {
		byte buf[]=new byte[1024];
		try {
			while (true){
				DatagramPacket dp=new DatagramPacket(buf, buf.length);
				ds.receive(dp);
				byte data[]=dp.getData();
				String ip=dp.getAddress().getHostAddress();
				String info=new String(data);
				System.out.println(ip+" says "+info);
				if (info.equalsIgnoreCase("over")){
					System.out.println(ip+" has left the chatting room......");
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}</span>

聊天方二:

package cn.hncu.url.udp.chat2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

import com.sun.imageio.plugins.common.InputStreamAdapter;

public class UDPChat2 {

	public static void main(String[] args) {
		try {
			DatagramSocket send=new DatagramSocket(10003);
			DatagramSocket receive=new DatagramSocket(10004);

			new Thread(new Send(send)).start();
			new Thread(new Receive(receive)).start();
		} catch (SocketException e) {
			e.printStackTrace();
		}

	}
}

class Send implements Runnable{
	private DatagramSocket ds=null;
	public Send(DatagramSocket ds){
		this.ds=ds;
	}

	@Override
	public void run() {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line=null;
		try {
			while ((line=br.readLine())!=null){
				byte buf[]=line.getBytes();
				//下面的ip地址我用xxx.xxx.xxx.xxx表示,这里要使用你自己的ip地址,运行时记得改过来
				DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("<span style="font-family: Arial, Helvetica, sans-serif;">xxx.xxx.xxx.xxx</span><span style="font-family: Arial, Helvetica, sans-serif;">"),10002);</span>
				ds.send(dp);
				if (line.equalsIgnoreCase("over")){
					break;
				}
			}
			ds.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

class Receive implements Runnable{
	private DatagramSocket ds=null;
	public Receive(DatagramSocket ds){
		this.ds=ds;
	}

	@Override
	public void run() {
		byte buf[]=new byte[1024];
		try {
			while (true){
				DatagramPacket dp=new DatagramPacket(buf, buf.length);
				ds.receive(dp);
				byte data[]=dp.getData();
				String ip=dp.getAddress().getHostAddress();
				String info=new String(data);
				System.out.println(ip+" says "+info);
				if (info.equalsIgnoreCase("over")){
					System.out.println(ip+" has left the chatting room......");
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
时间: 2024-11-10 01:29:53

Java之------socket系列(三)的相关文章

Java之------socket系列(四)TCP

TCP传输 TCP Socket:IP地址和端口,套接字 Socket和ServerSocket 建立客户端和服务器端 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器端是两个独立的应用程序. TCP传输编程 ☆基本思路(客户端) 客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常. 连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过g

Java设计模式菜鸟系列(三)装饰者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39759199 装饰者(Decorator)模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案.对于装饰者模式,它其实是一种包装,所以我更愿意称它为一种包装.像咱们以前经常使用的Java里面的IO流就用到了装饰者模式.比如:BufferedReader br = new BufferedReader(new InputStreamReader(new Fi

Java之------socket系列(二)UDP

☆ UDP: 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小在限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快 DatagramSocket和 DatagramPacket类 UDP传输: DatagramSocket与DatagramPacket 建立发送端,接收端. 建立数据包. 调用Socket的发送接收方法. 关闭Socket. 发送端与接收端是两个独立的运行程序. UDP传输编程: ☆发送端 在发送端,要在数据包对象中明确目的地IP及端口. Datagr

C# Socket系列三 socket通信的封包和拆包

通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 TCPListener tcp = new TCPListener(); 6 TSocketClient client = new TSocketClient(); 7 for (int i = 0; i < 10; i++) 8 { 9 client.

深入理解JAVA I/O系列三:字符流详解

字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节.如果JAVA不能直接操作字符,我会感到JAVA对这个世界满满的恶意,所以提供对直接的字符输入/输出的支持是很有必要的,因为我们的口号是:一次编写,到处运行. 字符流的概念 输出字符流:把要写入文件的字符序列(实际是unicode码元序列)转为指定编码方式下的字节序列,然后在写入文件中. 输入字符流

Java之------socket系列(一)

网络编程 相关基础概念: 1.计算机网络与Internet 2.TCP/IP协议 3.Internet地址 IP地址,形如xxx.xxx.xxx.xxx 域名系统.例如www.edu.cn URL(统一资源定位符) 协议 :// 主机 [: 端口] [/ 文件] [# 引用] 客户-服务器(Client-Server)模式 网络模型与通讯要素: 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 ☆七层简述: 1.物理层:主要定义物理设备标准,如网线的接口类

java新知识系列 三

1:trycatch中需要注意的地方. 2:ServletConfig以及ServletContext对象. 3: Spring事务属性的种类:   传播行为.隔离级别.只读和事务超时. 5:关于程序继承的报错. 6:java数组具有协变性,而java集合不是协变的. 7:  EL表达式:http://www.cnblogs.com/xushuai123/archive/2013/03/24/2979711.html 8:常见类的线程安全属性,以及如何去判断一个类是否是线程安全的方法以及源码实例

Java设计模式菜鸟系列总结及博客全目录

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40031567 今天来对这23种设计模式做个总结.咱使用设计模式的目的是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,当然设计模式并不是万能的,项目中的实际问题还有具体分析.咱不能为了使用设计模式而使用,而是在分析问题的过程中,想到使用某种设计模式能达到咱需要的效果,而且比不使用设计模式更有优势,那么咱该考虑使用设计模式了. 一.设计模式的一般分类 创建型(Creator)模式(

java基础解析系列(十一)---equals、==和hashcode方法

java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及装箱拆箱 java基础解析系列(三)---HashMap原理 java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 j