23-网络编程,socket,tcp,udp
- 网络: 一组相互连接的计算机,多台计算机组成,使用物理线路进行连接(网卡,网线)
- 网络编程的三要素:
- IP地址: --找到对方的位置
- 唯一标识网络上的每一台计算机
- 特殊的ip地址: 127.0.0.1 本机ip地址
- InetAddress java.net
- 端口号: --门牌号码
- 计算机中应用的标号(代表一个应用程序) 范围:0~65535 0~1023为系统使用或保留端口号
- 特殊的端口号:
- 1521 --oracle
- 1433 --sqlserver
- 3306 --mysql
- 8080 --Tomcat
- 通信协议: 通信的方式:
- UDP :
- 相当于发信息,不需要建立连接
- 数据包的大小限制在64k内
- 数据不安全,容易丢包
- TCP:
- 相当于打电话,需要建立连接
- 效率相对较低,数据传输安全
- 三次握手
- Socket(套接字): tcp协议
- 网络上的两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称之为Socket,另一端称之为ServerSocket
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Inet {
public static void main(String[] args) throws UnknownHostException {
InetAddress ia = InetAddress.getLocalHost();
System.out.println(ia);
System.out.println("主机名称是: "+ia.getHostName());
System.out.println("主机IP地址是: "+ia.getHostAddress());
InetAddress iaa = InetAddress.getByName("USERCHI-9K2PKNG");
InetAddress iaaa= InetAddress.getByName("192.168.1.3");
InetAddress iaaaa = InetAddress.getByName("www.baidu.com");
System.out.println("lalal: "+iaa);
System.out.println(iaaa);
System.out.println(iaaaa);
}
}
- TCP:
- 客户端:
- 启动有先后,先启动服务器,再启动客户端
- 启动之后,客户端和服务器平级,谁发送数据都可以
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class NetClient {
public static void main(String[] args) throws IOException {
Socket client = new Socket("localhost", 5555);
OutputStream os = client.getOutputStream();
String str = "你好,妹子,你在吗?";
os.write(str.getBytes());
client.shutdownOutput();
InputStream is = client.getInputStream();
byte[] by = new byte[1024];
int len = is.read(by);
is.read(by, 0, len);
System.out.println("妹子回复说: "+new String(by, 0, len));
is.close();
os.close();
client.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class NetServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(5555);
Socket client = ss.accept();
InputStream is = client.getInputStream();
byte[] by = new byte[1024];
int len = is.read(by);
String str = new String(by, 0, len);
client.shutdownInput();
System.out.println("收到: 客户端的IP为"+client.getInetAddress()+"收到的信息为: "+str);
OutputStream os = client.getOutputStream();
os.write("干嘛呀,有事儿吗?".getBytes());
client.shutdownOutput();
is.close();
os.close();
client.close();
ss.close();
}
}
- UDP: 发送方: 发送方和接收方平级,但是还是要先开接收方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class AskClient {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(8888);
String str = "大吉大利";
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(), 7777);
ds.send(dp);
byte[] by = new byte[1024];
DatagramPacket dp2 = new DatagramPacket(by, by.length);
ds.receive(dp2);
System.out.println(new String(by, 0, dp2.getLength()));
ds.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class AskServer {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(7777);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by, by.length);
ds.receive(dp);
System.out.println(new String(by, 0, dp.getLength()));
String str = "晚上吃鸡";
DatagramPacket dp2 = new DatagramPacket(str.getBytes(), str.getBytes().length, dp.getAddress(), 8888);
ds.send(dp2);
ds.close();
}
}