java基础知识回顾之java Socket学习
UDP传输:面向无连接的协议,不可靠,只是把应用程序传给IP层的数据报包发送出去,不保证发送出去的数据报包能到达目的地。不用再客户端和服务器端建立连接,没有超时重发等机制,传输速度快是它的优点。就像寄信,写好信放到邮箱桶里面,既不能保证信件在邮递过程中不丢失,也不能保证信件是按顺序寄到目的地的。
看java API用到java.net.DatagramSocket和java.net.DatagramPacket类:
DatagramSocket:此类表示用来发送和接收数据报包的套接字(IP地址和端口号)。
DatagramPacket:数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
下面看一个简单的接收端和服务端的代码:
接收端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPReceDemo { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException { System.out.println("接收端启动......");
/*
* 建立UDP接收端的思路。
* 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
* 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
* 3,使用socket服务的receive方法将接收的数据存储到数据包中。
* 4,通过数据包的方法解析数据包中的数据。
* 5,关闭资源
*/ //1,建立udp socket服务。
DatagramSocket ds = new DatagramSocket(10000);//接受端应用程序的端口号 //2,创建数据包,用来接收长度为length的数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length); //3,使用接收方法将数据存储到数据包中。
ds.receive(dp);//阻塞式的。 //4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();//返回主机的端口号
String text = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+":"+text); //5,关闭资源。
ds.close();
}
}

发送端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPSendDemo { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException { System.out.println("发送端启动......");
/*
* 创建UDP传输的发送端。
* 思路:
* 1,建立udp的socket服务。
* 2,将要发送的数据封装到数据报包中。
* 3,通过udp的socket服务将数据包发送出去。
* 4,关闭socket服务。
*/
//1,udpsocket服务。使用DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(); //2,将要发送的数据封装到数据包中。
String str = "udp传输。。。。。。。。。。。。";
//使用DatagramPacket将数据封装到的该对象包中。
byte[] buf = str.getBytes();
//DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("QT-201216220606"),10000);
//3,通过up的socket服务将数据报发送出去。使用send方法。
ds.send(dp); //4,关闭资源。
ds.close();
} }

接收端启动,然后发送端启动,结果发送端向接收端主机发送了:192.168.0.101:4882:udp传输。。。。。。。。。。。。内容。
其它不变,发送端的代码改变,变为可以实现键盘的输入(UDP协议):

package cn.itcast.net.p2.udp; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPSendDemo2 { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException { System.out.println("发送端启动......");
/*
* 创建UDP传输的发送端。
* 思路:
* 1,建立udp的socket服务。
* 2,将要发送的数据封装到数据包中。
* 3,通过udp的socket服务将数据包发送出去。
* 4,关闭socket服务。
*/
//1,udpsocket服务。使用DatagramSocket对象。
DatagramSocket ds = new DatagramSocket();
//键盘输入的内容发送给客户端,使用字节向字符转化的流
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null){
byte[] buf = line.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.101"),10000);
ds.send(dp); if("over".equals(line))
break;
} //4,关闭资源。
ds.close();
}
}

启动接收端,启动服务端,在服务端输入,在接收端收到信息。。。。。。。
简单的多人聊天室实现:使用多线程,IO:
接收端:

import java.net.DatagramPacket;
import java.net.DatagramSocket; public class Rece implements Runnable { private DatagramSocket ds; public Rece(DatagramSocket ds) {
this.ds = ds;
} @Override
public void run() {
try {
while (true) { // 2,创建数据包。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length); // 3,使用接收方法将数据存储到数据包中。
ds.receive(dp);// 阻塞式的。 // 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + "::" + text);
if(text.equals("over")){
System.out.println(ip+"....退出聊天室");
} }
} catch (Exception e) { } } }

服务端:

package cn.itcast.net.p3.chat; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds){
this.ds = ds;
} @Override
public void run() { try {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null; while((line=bufr.readLine())!=null){ byte[] buf = line.getBytes();
//表示把信息发送到192.168.0所有的IP地址上面,发送了一个广播IP地址最后一位1-254的所有主机都能收到
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.255"),10001);
ds.send(dp); if("886".equals(line))
break;
} ds.close();
} catch (Exception e) {
}
} }

启动程序:

import java.io.IOException;
import java.net.DatagramSocket; public class ChatDemo { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException { DatagramSocket send = new DatagramSocket(); DatagramSocket rece = new DatagramSocket(10001);
new Thread(new Send(send)).start();
new Thread(new Rece(rece)).start(); } }

TCP传输(传输控制协议):TCP协议是一种面向连接的,可靠的字节流服务。当客户端和服务器端彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能进行数据的传输。它将一台主机发出的字节流无差错的发送到互联网的其它主机。在发送端负责把上层传下来的字节流分成报文段传递给下层。在接收端负责把报文重组后交给上层。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
服务端:

package cn.itcast.net.p4.tcp; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class ServerDemo { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 服务端接收客户端发送过来的数据,并打印在控制台上。
/*
* 建立tcp服务端的思路:
* 1,创建服务端socket服务。通过ServerSocket对象。
* 2,服务端必须对外提供一个端口,否则客户端无法连接。
* 3,获取连接过来的客户端对象。
* 4,通过客户端对象获取socket流读取客户端发来的数据
* 并打印在控制台上。
* 5,关闭资源。关客户端,关服务端。
*/ //1创建服务端对象。
ServerSocket ss = new ServerSocket(10002); //2,获取连接过来的客户端对象。
Socket s = ss.accept();//阻塞式. String ip = s.getInetAddress().getHostAddress(); //3,通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text); s.close();
ss.close(); } }

客户端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class ClientDemo { /**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//客户端发数据到服务端
/*
* Tcp传输,客户端建立的过程。
* 1,创建tcp客户端socket服务。使用的是Socket对象。
* 建议该对象一创建就明确目的地。要连接的主机。
* 2,如果连接建立成功,说明数据传输通道已建立。
* 该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入,又有输出。
* 想要输入或者输出流对象,可以找Socket来获取。
* 可以通过getOutputStream(),和getInputStream()来获取两个字节流。
* 3,使用输出流,将数据写出。
* 4,关闭资源。
*/ //创建客户端socket服务。
Socket socket = new Socket("192.168.1.101",10002); //获取socket流中的输出流。
OutputStream out = socket.getOutputStream(); //使用输出流将指定的数据写出去。
out.write("tcp演示:哥们又来了!".getBytes()); //关闭资源。
socket.close();
} }

输出:192.168.1.101:tcp演示:哥们又来了!
服务端收到客户端的数据后返回给客户端一个信息:

package cn.itcast.net.p4.tcp; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class ServerDemo2 { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 服务端接收客户端发送过来的数据,并打印在控制台上。
/*
* 建立tcp服务端的思路:
* 1,创建服务端socket服务。通过ServerSocket对象。
* 2,服务端必须对外提供一个端口,否则客户端无法连接。
* 3,获取连接过来的客户端对象。
* 4,通过客户端对象获取socket流读取客户端发来的数据
* 并打印在控制台上。
* 5,关闭资源。关客户端,关服务端。
*/ //1创建服务端对象。
ServerSocket ss = new ServerSocket(10002); //2,获取连接过来的客户端对象。
Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); //3,通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text); //使用客户端socket对象的输出流给客户端返回数据
OutputStream out = s.getOutputStream();
out.write("收到客户端发送给我的信息".getBytes()); s.close();
ss.close(); } }

客户端:

package cn.itcast.net.p4.tcp; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class ClientDemo2 { /**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//客户端发数据到服务端
/*
* Tcp传输,客户端建立的过程。
* 1,创建tcp客户端socket服务。使用的是Socket对象。
* 建议该对象一创建就明确目的地。要连接的主机。
* 2,如果连接建立成功,说明数据传输通道已建立。
* 该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入,又有输出。
* 想要输入或者输出流对象,可以找Socket来获取。
* 可以通过getOutputStream(),和getInputStream()来获取两个字节流。
* 3,使用输出流,将数据写出。
* 4,关闭资源。
*/ Socket socket = new Socket("192.168.1.101",10002); OutputStream out = socket.getOutputStream(); out.write("tcp演示:哥们又来了!".getBytes()); //读取服务端返回的数据,使用socket读取流。
InputStream in = socket.getInputStream();
byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf,0,len); System.out.println(text); //关闭资源。
socket.close(); } }

结果:
收到客户端发送给我的信息
java基础知识回顾之java Socket学习的更多相关文章
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- java基础知识回顾之java集合类-Properties集合
/** java.lang.Object |--java.util.Dictionary<K,V> |--java.util.Hashtable<Object,Obje ...
- java基础知识回顾之java Socket学习(二)--TCP协议编程
TCP传输(传输控制协议):TCP协议是一种面向连接的,可靠的字节流服务.当客户端和服务器端彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能进行数据的传输.它将一台主机发出的字节流无差错的 ...
- java基础知识回顾之java Socket学习(一)--UDP协议编程
UDP传输:面向无连接的协议,不可靠,只是把应用程序传给IP层的数据报包发送出去,不保证发送出去的数据报包能到达目的地.不用再客户端和服务器端建立连接,没有超时重发等机制,传输速度快是它的优点.就像寄 ...
- java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍
线程的概述: 线程是程序的多个执行路径,执行调度的单位,依托于进程存在.线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系 ...
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
看API文档介绍几个方法: JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock 2.接口Conditio ...
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
*java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...
- java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:
总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但 ...
- java基础知识回顾之java Thread类学习(十二)-- 线程中断
官方文档翻译: 如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), ...
随机推荐
- Visual Studio Release版本开启debug窗口进行调试输出。
"项目 -> 属性 -> 生成事件 ->后期生成事件 -> 命令行" 中添加: editbin /SUBSYSTEM:CONSOLE $(OutDir)\$ ...
- 3. jenkins的管理
1. jenkins的插件管理 Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用.例如从Gitlab拉取代码,使用Maven构建项目等功能需要依靠插件完成.接下来演示如何下载 ...
- 7、listener监听
启动远程图形界面登录的工具 [root@db11g ~]# vncserver 监听 监听的启动 [oracle@db11g ~]$ lsnrctl start 判断监听是否启动 [oracle@db ...
- 报错处理TypeError: can't multiply sequence by non-int of type 'float'
在练习格式化输出时出现错误TypeError: can't multiply sequence by non-int of type 'float' 为什么会出现TypeError:不能将序列乘以'f ...
- 深度探讨Java字节代码的操纵方法
本文为IBM工程师成富编写的<Java深度历险>的第一部分Java字节代码的操纵,像这样Java语言的深度理解和运用还没有很多文章,我们把他奉献给读者,希望读者们喜欢. AD:2013云计 ...
- Java多线程设计模式(6)两阶段终止模式
一 Two-Phase Termination Pattern Two-Phase Termination Pattern,指的就是当希望结束一个线程的时候,送出一个终止请求,但是不会马上停止,做一些 ...
- Linux之JSON处理工具jq
一个灵活的轻量级命令行JSON处理器 补充说明 jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 jq 项目主页 jq 用于处理JSON输入,将给定过滤器应用于其 ...
- Go操作数据库之MySQL
安装mysql驱动: go get -u github.com/go-sql-driver/mysql 初始化模块 go mod init m 执行 go mod tidy 导入包: package ...
- python常用模块汇总
os模块 os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作目 ...
- C++ 实现万年历(原创)
2020年08月31日 首次分享文档源代码. 2023年11月23日 对文档.代码进行了更新,希望可以帮助到你. 1. 实现功能 提供菜单方式选择,假定输入的年份在1940-2040年之间. 输入一个 ...