网络编程概念。一个UDP构造的聊天室
来源:互联网 发布:英雄联盟网络多少正常 编辑:程序博客网 时间:2024/06/14 18:09
网络编程:利用网络将不同计算机数据进行交换
网络三要素:
IP地址 + 端口 =Socket
协议 :UDP,TCP
inetAddress类的使用
public class InetAddressDemo {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubInetAddress address = InetAddress.getByName("");System.out.println(address.getHostAddress());System.out.println(address.getHostName());InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost);}}用本机名和本机地址
UDP和TCP协议
UDP:将数据源和目的封装在数据包中,不需要建立连接,每个数据包大小在64K内,无连接,是不可靠协议,但是速度很快。
TCP:建立连接,形成传输数据的通道,在连接中进行大数据量的传输;通过三次握手完成连接,是可靠协议,但是效率会稍低。
Socket:应用层和传输层之间的桥梁。下面的底层已经封装好了,我们只需要用Socket进行操作就行了。
Socket原理机制:
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket之间通过IO传输
UDP传输服务器端编写
public class Server {public static void main(String[] args) throws Exception {//创建一个服务端Socket并监听指定端口DatagramSocket ds = new DatagramSocket(8888);//接收数据,并将数据放在数据包中byte[] buf =new byte[64*1024];int length = buf.length;DatagramPacket p = new DatagramPacket(buf, length);ds.receive(p);//将包中的数据取出来byte[] data=p.getData();//获取的是接受到的数据InetAddress address = p.getAddress();//接受发送过来的主机地址int port = p.getPort();//获取端口号String ip = address.getHostAddress();//获取的是客户端的ip地址int dataLength = p.getLength();//将数据转换成字符串String result = new String(data,0,dataLength);System.out.println("ip="+ip+",port="+port+",result="+result);//关闭资源ds.close();}}
UDP客户端客户端编写
public class Client {public static void main(String[] args) throws Exception {DatagramSocket ds = new DatagramSocket();byte[] buf = "UDP发送消息".getBytes();//包数据int length=buf.length;//包长度InetAddress address=InetAddress.getByName("127.0.0.1");//目的地址int port=8888;//目的端口号DatagramPacket p=new DatagramPacket(buf, length, address, port);// 调用Socket的发送方法ds.send(p);ds.close();}}
l聊天室初级版客户端
public class Client {public static void main(String[] args) throws Exception {DatagramSocket ds = new DatagramSocket();InetAddress address = InetAddress.getByName("127.0.0.1");Scanner sc = new Scanner(System.in);String line;while (!(line = sc.nextLine()).equals("886")) {byte[] buf = line.getBytes();DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 8888);ds.send(packet);}ds.close();}}服务器端
public class Server {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8888);//循环接受客户端发送的内容byte[] buf=new byte[64*1024];while(true){DatagramPacket packet = new DatagramPacket(buf, buf.length);//接受客户端数据并存储到包中socket.receive(packet);//从数据包中取出内容byte[] data = packet.getData();int length = packet.getLength();String ip = packet.getAddress().getHostAddress();//将字节数组的形式内容转化成字符串String result = new String(data,0,length);System.out.println("ip="+ip+",result="+result);}}}
注意点:服务器端创建Socket直接带端口号
如何和在一个界面上?
运用线程。让这俩个程序运行在同一个主线程内。
此时会报错。Command+option+z,try...catch一下。第一个意思是分别catch,第二个是 catch所有的Exception。
一个完整的UDP聊天室
客户端
public class ClientRunnable implements Runnable {private String ip;private int port;public ClientRunnable(String ip, int port) {this.ip = ip;this.port = port;}@Overridepublic void run() {DatagramSocket ds = null;try {ds = new DatagramSocket();InetAddress address = InetAddress.getByName(ip);Scanner sc = new Scanner(System.in);String line;while (!(line = sc.nextLine()).equals("886")) {byte[] buf = line.getBytes();DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);ds.send(packet);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (ds != null) {ds.close();}}}}服务器端
public class ServerRunnable implements Runnable {private int port;public ServerRunnable(int port) {this.port = port;}@Overridepublic void run() {try {DatagramSocket socket = new DatagramSocket(port);//循环接受客户端发送的内容byte[] buf=new byte[64*1024];while(true){DatagramPacket packet = new DatagramPacket(buf, buf.length);//接受客户端数据并存储到包中socket.receive(packet);//从数据包中取出内容byte[] data = packet.getData();int length = packet.getLength();String ip = packet.getAddress().getHostAddress();//将字节数组的形式内容转化成字符串String result = new String(data,0,length);System.out.println("ip="+ip+",result="+result);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}主程序
public class ChatRoom {public static void main(String[] args) {//先启动服务端聊天线程,再启动客户端聊天线程ClientRunnable clientRunnable = new ClientRunnable("127.0.0.1",8888);ThreadPoolUtils.execute(clientRunnable);ServerRunnable serverRunnable = new ServerRunnable(8888);ThreadPoolUtils.execute(serverRunnable);}}线程池
public class ThreadPoolUtils {private static ExecutorService threadpool = Executors.newCachedThreadPool();public static void execute(Runnable command) {threadpool.execute(command);}}
阅读全文
0 0
- 网络编程概念。一个UDP构造的聊天室
- <网络编程培训之四> 编写一个UDP聊天室
- 网络编程初探--使用UDP协议的简易聊天室
- 10 qt udp编程和网络聊天室的实现
- 网络编程-UDP协议---简单聊天室程序
- 黑马程序员----网络编程UDP多线程聊天室
- 一个简单的java UDP网络编程
- UDP网络聊天室
- Java网络编程 - 基于UDP协议 实现简单的聊天室程序
- linux网络编程——UDP局域网聊天室
- JAVA网络编程技术 - UDP练习,模仿多线程聊天室
- Java—网络编程实现UDP聊天室(局域网)
- 网络编程-概念及UDP、TCP连接
- 【SOCKET编程】基于C++的TCP/UDP的聊天室
- Java的网络编程之聊天室功能
- Windows网络编程-简单的多线程聊天室
- 基于Socket编程的网络聊天室
- 多人聊天室(基于Linux的SOCKET UDP编程)
- 根据域名获取ip地址
- PRB自用shader
- Java继承中属性、方法和对象的关系
- JS实现图片上传后自动显示
- C++学习笔记【第三部分第十三章:拷贝控制】
- 网络编程概念。一个UDP构造的聊天室
- XML 能干什么?
- Unknown column 'updated_at' in 'field list' (SQL: update `test` set `age` = 22, `updated_at` = 2017-
- Power Strings
- arch linux 安装笔记[2017年09月29日]
- autoreconf 命令
- java ant的使用
- 解决 Spring Tool Suite java.lang.NoClassDefFoundError 找不到第三方.jar 类问题
- HDU-1686