网络编程

网络编程简要概述
IP地址:网络上计算机的唯一标识
端口号Port:用来区分计算机上的应用程序
localhost/ 127.0.0.1 代表本地计算机的IP地址
Socket(插头):套接字就是网络上用于传输数据的流.
UDP:无连接的协议,发送端和接收端都不保证有反 馈。一般用于发送不太重要的数据。
单人聊天:使用一条线程代表发送,一条线程代表 接收,从而实现两个人聊天。 Ipconfig InetAddress – getHostAddress
TCP协议:每次连接都需要经过三次握手来保证连 接的正确性

获取iP地址和套接字

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class IPAddressDemo {
	public static void main(String[] args) throws UnknownHostException {
		// 本地的IP对象
		InetAddress local = InetAddress.getLocalHost();
		// 远程的IP对象
		InetAddress remote = InetAddress.getByName("www.baidu.com");
		System.out.println("本地的IP" +local.getHostAddress());
		System.out.println("远程的IP" + remote.getHostAddress());
		System.out.println(local.getHostName());
		InetSocketAddress isa = new InetSocketAddress("www.baidu.com", 80);
		// ip
		System.out.println(isa.getAddress());
		System.out.println(isa.getHostString());
		// 名字
		System.out.println(isa.getHostName());
		// 端口号
		System.out.println(isa.getPort());
	}
}

UDP原理图
网络编程
用UDP实现简单的聊天室
发送方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPSendDemo {
public static void main(String[] args) throws IOException {
// 使用UDP发送数据
// 1.创建码头
DatagramSocket ds = new DatagramSocket();
// 2.创建集装箱
byte[] bys = “helloworld”.getBytes();
// 参数1: 需要发送数据的字节数组
// 参数2: 发送字节数组的长度
// 参数3: 发送对方的IP地址
// 参数4: 发送对方的端口号
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName(“localhost”), 8090);
// 3.发送数据
ds.send(dp);
// 关闭
ds.close();
}
接收方

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiveDemo {
	public static void main(String[] args) throws IOException {
		// 使用UDP协议来接收数据
		
		// 1.创建码头,并且给了一个8090的编号
		DatagramSocket ds = new DatagramSocket(8090);
		// 2.创建一个空集装箱来存放数据
		// 参数1: 需要存放数据的字节数组  每次最多存放多少
		DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
		
		// 3.接收数据
		ds.receive(dp);
		
		// 4.查看数据
		String ipStr = dp.getAddress().getHostAddress();
		
		// 获取发送过来的data
		byte[] bys = dp.getData();
		// 获取实际接收的长度
		int length = dp.getLength();
		System.out.println(ipStr + ":" + new String(bys,0,length));
		
		// 关流
		ds.close();
	}
}

利用多线程实现来实现简答的聊天室

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UDPPractice {
	public static void main(String[] args) {
		// 开启两个线程,一个是发送数据,一个用来接收数据
		new Thread(new Sender()).start();
		new Thread(new Receiver()).start();
	}
}

class Receiver implements Runnable{
	
	private DatagramSocket ds;
	private DatagramPacket dp;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			ds = new DatagramSocket(8070);
			dp = new DatagramPacket(new byte[1024], 1024);
			
			while (true){
				// 接收数据  
				ds.receive(dp);
				// 获取IP
				String ipStr = dp.getAddress().getHostAddress();
				System.out.println(ipStr +  "说:" + new String(dp.getData(),0,dp.getLength()));
			}
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

class Sender implements Runnable{
	private Scanner sc;
	private DatagramSocket ds;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		try {
			sc = new Scanner(System.in);
			ds = new DatagramSocket();
			while (true){
				// 获取用户输入的字符串
				String str = sc.nextLine();
				// 转换字符串为字节数组
				byte[] bys = str.getBytes();
				// 创建数据包
				DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("255.255.255.255"), 8070);
				// 发送数据
				ds.send(dp);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

TCP简单介绍
客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
	public static void main(String[] args) throws IOException {
		// 向服务器发送数据,并且接收服务器返回的数据
		
		// 创建套接字  连接
		Socket s = new Socket("localhost",6666);
		
		// 获取字节输出流
		OutputStream os = s.getOutputStream();
		// 向服务器写入数据
		os.write("我是客户端".getBytes());
		
		// 获取字节输入流
		InputStream is = s.getInputStream();
		byte[] bys = new byte[1024];
		int len = is.read(bys);
		System.out.println(new String(bys,0,len));
		
		is.close();
		os.close();
		s.close();
	}
}

服务端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
	public static void main(String[] args) throws IOException {
		// 创建服务器套接字
		ServerSocket ss = new ServerSocket(6666);
		// 接收连接过来的socket  阻塞
		// 返回连接成功的socket
		Socket s = ss.accept();
		// 读取客户端提供的信息
		// 获取字节输入流
		InputStream is = s.getInputStream();
		byte[] bys = new byte[1024];
		int len = is.read(bys);
		System.out.println("客户端说:" + new String(bys,0,len));
		
		// 给客户端一点反馈
		// 获取字节输出流
		OutputStream os = s.getOutputStream();
		os.write("您已成功连接".getBytes());
		os.close();
		is.close();
		
		s.close();
	}
}