1.网络编程概述
三要素:
(1)iP地址:标识设备
(2)端口:标识应用程序
(3)协议:规则
iP地址:
分类:ipv4:32bit,ipv6:128bit
查看ip地址:ipconfig
看是否联通 ping +IP地址
InetAddress:
package demo07Internet;
import java.net.InetAddress;
import java.net.UnknownHostException;
/*
String getHostAddress() 返回文本显示中的IP地址字符串。
String getHostName() 获取此IP地址的主机名
static InetAddress getByName(String host) 确定主机名称的IP地址。
*/
public class Demo01 {
public static void main(String[] args) throws UnknownHostException {
InetAddress ia = InetAddress.getByName("10.66.92.161");
String hostName = ia.getHostName();
String hostAddress = ia.getHostAddress();
System.out.println(hostName+hostAddress);//windows10.microdone.cn10.66.92.161
}
}
2.UDP
使用udp发送数据:
package demo07Internet;
import java.io.IOException;
import java.net.*;
/*
UDP发送数据
1.使用DatagramSocket类表示用于发送和接收数据报数据包的套接字
2.创建数据并将数据打包
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
3.发送void send(DatagramPacket p) 从此套接字发送数据报包。
4.关闭
*/
public class Demo02UDP {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket();
byte[] bys = "hello,upd".getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("10.66.92.161"),10086);
ds.send(dp);
ds.close();
}
}
udp接收数据:
package demo07Internet;
import org.w3c.dom.ls.LSOutput;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
udp接收数据
1.创建接收端的socket对象
2.创建一个数据包用于接收数据
3.用receive方法接收数据
4.解析数据包,在控制台显示
5.关闭接收端
*/
public class Demo03UDP {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10086);
byte[]bys=new byte [1024];
DatagramPacket dp=new DatagramPacket(bys,bys.length);
ds.receive(dp);
byte[] dts = dp.getData();
int length = dp.getLength();
String s = new String(dts,0,length);
System.out.println("接收到的数据是:"+s);
ds.close();
}
}
udp通信案例:
package demo07Internet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
/*
udp通信程序练习
*/
public class Demo04Send {
public static void main(String[] args) throws IOException {
//调用Datagram创建套接字
DatagramSocket ds=new DatagramSocket();
//键盘输入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s;
while((s=br.readLine())!=null){
if("886".equals(s)){
break;
}
//创建网络包
byte[] bys = s.getBytes();
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("10.66.92.161"),10099);
ds.send(dp);
}
ds.close();
}
}
package demo07Internet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Demo05Receive {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10099);
while (true){
byte[] bys = new byte[1024];
DatagramPacket dp=new DatagramPacket(bys,0,bys.length);
ds.receive(dp);
String s = new String(bys);
System.out.println(s);
}
//ds.close();
}
}
3.TCP
三次握手(客户端和服务器之间):
(1)客户端发送连接请求
(2)服务器收到连接请求,返回响应
(3)客户端收到响应,返回确认信息
使用场景:浏览网页,上传,下载
tcp发送数据:
package demo07Internet;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
/*
tcp发送数据
*/
public class Demo06tcp {
public static void main(String[] args) throws IOException {
//创建套接字
//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
Socket so=new Socket("10.66.92.161",10088);
//用输出流写数据
//getOutputStream() 返回此套接字的输出流。
OutputStream os=so.getOutputStream();
os.write("wolaile haah".getBytes());
os.close();
}
}
tcp接收数据:
package demo07Internet;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
tcp接收数据
*/
public class Demo07Tcp {
public static void main(String[] args) throws IOException {
//ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
//创建ServerSocket对象
ServerSocket ss =new ServerSocket(10088);
//连接发送端的套接字
//Socket accept() 侦听要连接到此套接字并接受它。
Socket s = ss.accept();
//读数据
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int r = is.read(bys);
String s1 = new String(bys,0,r);
System.out.println(s1);
//释放资源
s.close();
ss.close();
}
}
有反馈的传输数据:
package demo07Internet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
//客户端:发送数据,接收服务器反馈
public class Demo08tcp {
public static void main(String[] args) throws IOException {
Socket s=new Socket("10.66.92.161",10088);
//发送数据
OutputStream os = s.getOutputStream();
os.write("俺是中国人".getBytes());
//接受反馈
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String s1 = new String(bys, 0, len);
System.out.println(s1);
//释放资源
s.close();
}
}
package demo07Internet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//接收数据,给出反馈
public class Demo09tcp {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10088);
Socket s = ss.accept();
//读数据
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String s1 = new String(bys, 0, len);
System.out.println(s1);
//反馈,写数据
OutputStream os = s.getOutputStream();
os.write("服务器已经收到".getBytes());
ss.close();
}
}
tcp通信(来自键盘录入)
package demo07Internet;
import java.io.*;
import java.net.Socket;
//tcp通信,来自键盘录入
public class Demo10tcp {
public static void main(String[] args) throws IOException {
//客户端
//创建socket对象
Socket s=new Socket("10.66.92.161",10088);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while((line=br.readLine())!=null){
if("886".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
}
}
package demo07Internet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo11tcp {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10088);
Socket s = ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while((line=br.readLine())!=null){
System.out.println(line);
}
ss.close();
}
}
tcp通信(服务器接受的内容保存到文本文件)
//客户端代码不变
package demo07Internet;
//服务器接收到的内容写入文本文件
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo11tcp {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10088);
Socket s = ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw=new BufferedWriter(new FileWriter("s.txt"));
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
ss.close();
}
}
tcp通信:客户端发送的内容来自文本文件
package demo07Internet;
import java.io.*;
import java.net.Socket;
//tcp通信,客户端发送的内容来自文本文件
public class Demo10tcp {
public static void main(String[] args) throws IOException {
//客户端
//创建socket对象
Socket s=new Socket("10.66.92.161",10088);
BufferedReader br=new BufferedReader(new FileReader("Box.java"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
s.close();
}
}
tcp通信:反馈+多线程
package demo07Internet;
import java.io.*;
import java.net.Socket;
//tcp通信,客户端发送的内容来自文本文件
public class Demo10tcp {
public static void main(String[] args) throws IOException {
//客户端
//创建socket对象
Socket s=new Socket("10.66.92.161",10088);
BufferedReader br=new BufferedReader(new FileReader("Box.java"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
s.shutdownOutput();//文件传输结束的标志
//接受反馈
BufferedReader br1=new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = br1.readLine();
System.out.println("客户端接收到反馈"+data);
br.close();
s.close();
}
}
package demo07Internet;
//服务器接收到的内容写入文本文件
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo11tcp {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10088);
while(true){
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
package demo07Internet;
import java.io.*;
import java.net.Socket;
public class ServerThread implements Runnable {
private Socket s;
public ServerThread(Socket s) {
this.s=s;
}
public void run(){
BufferedReader br= null;
try {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//BufferedWriter bw=new BufferedWriter(new FileWriter("copy.java"));
//解决名称冲突
int count=0;
File file=new File("copy["+count+"].java");
while(file.exists()){
count++;
file=new File("copy["+count+"].java");
}
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//给出反馈
BufferedWriter bw1=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw1.write("文件上传成功");
bw1.newLine();
bw1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}