1.网络编程三要素:A:ip:一个计算机的标识。
B:端口:每个应用程序对应一个端口用来通信,有效端口:0-65535,其中0-1024
系统使用或保留端口。
C:协议:TCP和UDP协议。
2.IP:特殊IP:127.0.0.1:本地回环地址,用来做本地测试。
Ping IP地址:该指令用来检测本机是否可以和指定的IP地址的计算机进行正常通信。
ipconfig:该指令用来查看本机的ip地址
xxx.xxx.xxx.255:广播地址,该地址发出的信息在该局域网内的所有ip都可查看。
3.端口号:物理端口:物理设备对应的端口,网卡口。
逻辑端口:用来标识我们的计算机上的进程,端口号有效范围是0-65535,0-1024为系统占用
4.协议:UDP:把数据打包成数据包,不需要建立连接。数据包大小有限制,不能超过64k。因为无连接,因此属于
不可靠协议(可能丢失数据),但是效率高。
TCP:需要建立连接形成连接通道,数据用该通道进行传输,没有大小限制,因为有连接,属于可靠协议,
但是传输效率低。
5.InetAddress:为了方便我们对IP地址的获取和操作而产生的类。可以用此类表示IP地址。
public static InetAddress getByName(String host)( host: 可以是主机名,也可以是IP地址的字符串表
现形式)
public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。
public String getHostName()获取此 IP 地址的主机名。
6.网络编程,也叫socket编程,套接字编程。网络上具有唯一标识的IP和端口组合构成唯一能识别的标识符套接字。
socket原理机制:通信两端都有socket,数据在两个socket之间通过io流传输。
7.UDP协议进行网络编程:
A:UDP发送端步骤:1.创建UDP发送数据端socket对象。
2.创建数据包并将数据封装在包内。
3.通过socket对象发送数据包。
4.释放资源。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String[] args) throws Exception {
InetAddress add=InetAddress.getByName("Lenovo-PC");
DatagramSocket ds=new DatagramSocket();
byte[] buf="java".getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length, add, 9999);
ds.send(dp);
ds.close();
}
}
B:UDP接收端步骤:1.创建UDP接收数据端socket对象。
2.创建接收数据的数据包并接收数据。
3.从数据包中解析出数据。
4.释放资源。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) throws Exception {
DatagramSocket ds=new DatagramSocket(9999);
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
System.out.println(new String(buf, 0, dp.getLength()));
ds.close();
}
}
多线程实现聊天室(相当于是将发送数据端和接收数据端合并)
输入线程:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class ClientThread implements Runnable{
DatagramSocket ds;
public ClientThread(DatagramSocket ds) {
super();
this.ds = ds;
}
public void run() {
try {
InetAddress add=InetAddress.getByName("Lenovo-PC");
Scanner sc=new Scanner(System.in);
String s;
while(true){
s=sc.nextLine();
if(s.equals("exit")){
break;
}
byte[] chs=s.getBytes();
DatagramPacket dp=new DatagramPacket(chs,chs.length, add, 10086);
ds.send(dp);
}
ds.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
输出线程:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ServerThread implements Runnable{
DatagramSocket ds;
public ServerThread(DatagramSocket ds) {//构造传参
super();
this.ds = ds;
}
public void run() {
try {
while(true){
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
System.out.println(new String(buf, 0, dp.getLength()));
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
主程序:
import java.net.DatagramSocket;
public class MainThread {
public static void main(String[] args) throws Exception {
DatagramSocket ds=new DatagramSocket();
new Thread(new ClientThread(ds)).start();
new Thread(new ServerThread(new DatagramSocket(10086))).start();
}
}
8.TCP协议进行网络编程:
发送数据步骤:A:创建TCP协议发送端Socket对象,指定服务器IP及端口。
B:获取输出流,并写数据。
C:释放资源。(由于TCP是一种可靠的协议,所以只能先运行接收端,在运行发送端)
接收数据步骤:A:创建TCP接收端socket对象,指定端口。
B:监听客户端链接。
C:获取输出流并读取数据。
D:释放资源。
exp:客户端键盘录入数据,服务端将数据写入文件
键盘录入文件并输入到服务端:
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class TCPClient {
public static void main(String[] args) throws Exception {
InetAddress add=InetAddress.getByName("Lenovo-PC");
Socket sk=new Socket(add, 9527);
Scanner sc=new Scanner(System.in);
String s;
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
while((s=sc.nextLine())!=null){
bw.write(s);
bw.newLine();
bw.flush();
}
bw.close();
sk.close();
}
}
读取io流中数据并写入文件:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws Exception {
ServerSocket ss=new ServerSocket(9527);
Socket sk=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream()));
BufferedWriter bw=new BufferedWriter(new FileWriter("sun.txt"));
String s;
while((s=br.readLine())!=null){
System.out.println(s);
bw.write(s);
bw.newLine();
bw.flush();
}
bw.close();
sk.close();
}
}