网络编程
网络编程简要概述:
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();
}
}