标签:表名 本地 lazy length readline tag 输出 修改主机名 测试
Internet Protocol Address
,网络协议地址。是分配给上网设备的数字标签。ping www.itheima.com
的过程解析ipv4:32bit来表示
ipv6:128bit来表示
查看本机的IP地址
ifconfig
ifconfig | grep net
用管道符号+grep命令来过滤一下,更方便查看检查网络是否连通(还可以确定域名的IP地址)
ping IP地址
127.0.0.1
:回送地址,本地回环地址。可以代表本机的IP地址,一般用来测试使用6.1、含义
6.2、常用方法
static InetAddress getByName("String host")
:通过主机名获取InetAdress对象,host可以是主机名,也可以是IP地址String getHostName()
:获取主机名String getHostAddress()
:获取IP地址6.3、关于Mac查看和修改主机名和计算机名
https://www.jianshu.com/p/dbf2fa105f26
UDP(User Datagram Protocol)用户数据报协议
面向无连接:只管发送,不必先建立连接,都可以发送成功。如果两者已经连接,就能成功接收;
特点
常见场景:音视频、普通数据
public class ClientDemo {
public static void main(String[] args) throws IOException {
//1.找码头
DatagramSocket ds = new DatagramSocket();
//2.打包数据
String message = "你好哇,李婷婷!";
byte[] bytes = message.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
//3.发送数据
ds.send(dp);
//4.释放资源
ds.close();
}
}
public class ServerDemo {
public static void main(String[] args) throws IOException {
//1.找码头 ---表示从10000端口号接收数据,否则就是从随机端口接收数据
DatagramSocket ds = new DatagramSocket(10000);
//2.创建包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//3.接受包
ds.receive(dp);
//4.打开包得到数据
byte[] data = dp.getData();
System.out.println(new String(data));
//5.释放资源
ds.close();
}
}
其实,数组data是多余的,直接用bytes也可以得到数据
组播地址:244.0.0.0 ~ 244.255.255.255 。其中244.0.0.0 ~ 244.0.0.255是预留的组播地址
TCP通信协议是一种可靠的网络协议,所以在通信两端各建立一个Socket对象
通信之前,要保证建立连接
通过socket产生IO流来进行通信
①、创建客户端Socket对象,与指定的服务端连接
②、获取输出流,写出数据
③、释放资源
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 10000);
OutputStream os = socket.getOutputStream();
os.write("xian".getBytes());
os.close();
socket.close();
}
}
//注意:此时如果我们运行,是会报异常ConnectException,因为无法和接收端建立连接
①、创建服务端Socket对象(ServerSocket)
②、监听客户端,返回一个Socket对象
③、获取输入流,读数据,把数据显示在控制台
④、释放资源
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10000);
System.out.println(111);
Socket accept = ss.accept();//等待客户端来进行连接,一直等待
System.out.println(222);
//复习
InputStream is = accept.getInputStream();
int b;
while ((b = is.read() )!= -1){
System.out.println((char) b);
}
is.close();
ss.close();
}
}
ss.accept()
处等待客户端连接注意
下面的类比就尼玛离谱,公平打在有才上
os.close()
会附带一个结束标记,来让read结束socket.close()
关闭连接通过:四次挥手客户端:发送数据,接受服务端反馈
服务端:接收数据,给出反馈
客户端代码
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建socket对象
Socket socket = new Socket("127.0.0.1", 10086);
//获取输出流,写出数据
OutputStream os = socket.getOutputStream();
os.write("hello".getBytes());
socket.shutdownOutput();//关闭输出流,写一个结束标记给接收端,不会关闭socket
//获取输入流,读入数据
/*
InputStream is = socket.getInputStream();
int b;
while ((b = is.read()) != -1){
System.out.println((char) b);
}
*/
//因为接受的是中文,用字节流会乱码,socket又没有字符流,--->用缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
}
//关闭资源
br.close();
os.close();
socket.close();
}
}
服务端代码
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建socket对象
ServerSocket ss = new ServerSocket(10086);
//监听客户端,返回一个Socket对象
Socket accept = ss.accept();
//获取输入流,读入数据
InputStream is = accept.getInputStream();
int b;
while ((b = is.read()) != -1){
System.out.println((char) b);
}
//获取输出流,写出数据
/*OutputStream os = accept.getOutputStream();
os.write("你谁啊".getBytes());*/
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bw.write("你谁啊?");
//关闭资源
bw.close();
is.close();
ss.close();
}
}
客户端:将文件上传到服务器,接受服务器的反馈
服务器:接受客户端上传的文件,上传完毕后给出反馈
客户端代码
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建socket
Socket socket = new Socket("127.0.0.1", 10086);
//本地流,读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("heima/ClientDir/java图标.jpg"));
//网络中的流,写到服务器
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
int b;
while ((b = bis.read()) != -1){
bos.write(b);
}
socket.shutdownOutput();//给服务器一个结束标记,表名传输完毕
//获取服务端数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
}
//关闭资源
socket.close();
bis.close();
}
}
服务端代码
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建socket
ServerSocket ss = new ServerSocket(10086);
//等待连接
Socket accept = ss.accept();
//网络中的流,读取客户端数据
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
//本地的流,持久化
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("heima/ServerDir/copy.jpg"));
//读取,持久化到本地
int b;
while ((b = bis.read()) != -1){
bos.write(b);
}
//发送反馈信息
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bw.write("上传成功");
bw.newLine();
bw.flush();
//关闭资源
ss.close();
accept.close();//网络中的流,随着socket的关闭也会关闭
bos.close();
}
}
标签:表名 本地 lazy length readline tag 输出 修改主机名 测试
原文地址:https://www.cnblogs.com/liuzhixian666/p/14353485.html