23-网络编程,socket,tcp,udp

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());
		
		//getByName();			//根据xxx找xxx
		//根据主机找ip,找到返回ip,找不到异常
		InetAddress iaa = InetAddress.getByName("USERCHI-9K2PKNG");
		//根据ip找主机名,找到就返回主机IP,找不到返回输入的IP
		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 {
		//[1]创建一个Socket对象		--服务器ip,服务器监听端口
		Socket client = new Socket("localhost", 5555);
		//[2]准备向服务器发送数据
		OutputStream os = client.getOutputStream();
		String str = "你好,妹子,你在吗?";
		os.write(str.getBytes());		//将字符串转成byte类型数据
		//[3]发送连接完毕
		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));
		
		//[4]关闭流
		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 {
		//[1]创建服务器Socket对象
		ServerSocket ss = new ServerSocket(5555);
		
		//[2]创建客户端对象
		Socket client = ss.accept();
		
		//[3]获取客户端发来的信息    --输入流
		InputStream is = client.getInputStream();
		byte[] by = new byte[1024];
		int len = is.read(by);
		String str = new String(by, 0, len);
		
		//[4]接收完毕
		client.shutdownInput();
		System.out.println("收到: 客户端的IP为"+client.getInetAddress()+"收到的信息为: "+str);
		
		//回复消息
		OutputStream os = client.getOutputStream();
		os.write("干嘛呀,有事儿吗?".getBytes());
		client.shutdownOutput();
		
		//[5]关流
		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 {
		//[1]创建一个接收发送数据对象
		DatagramSocket ds = new DatagramSocket(8888);
		
		//[2]创建数据报包的对象,用于对发送的数据打包
		String str = "大吉大利";
		DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(), 7777);
		
		//[3]发送数据
		ds.send(dp);
		
		//回复
		//[2]创建数据报包
		byte[] by = new byte[1024];
		DatagramPacket dp2 = new DatagramPacket(by, by.length);
		
		//[3]接收
		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;

/**
 * 客服小姐姐
 * @author Administrator
 *
 */
public class AskServer {
	public static void main(String[] args) throws IOException {
		//[1]创建对象
		DatagramSocket ds = new DatagramSocket(7777);
		
		//[2]创建数据报包
		byte[] by = new byte[1024];
		DatagramPacket dp = new DatagramPacket(by, by.length);
		
		//[3]接收
		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);
		
		//[4]关流
		ds.close();
	}
}

猜你喜欢

转载自blog.csdn.net/qq_26270869/article/details/90174464