网络编程
10.网络编程的概念
10.1)网络编程的三要素
网络编程的三要素
举例:
1)找到高圆圆---->ip地址
2)对它说话 ----(耳朵说)----端口号
3)找到她了,对她说: ---->协议
i love you(比如:不懂英语,说中文)
协议 ip地址 端口号
网络协议
UDP和TCP
UDP和TCP协议的区别:
1)是否需要建立连接通道
UDP:不需要建立通道 (QQ聊天,发短信)
TCP:需要建立连接通道(打电话...)
2)是否是可靠连接(是否安全)
UDP:是一种不可靠连接,不安全--执行效率高
TCP:是一种可靠连接,服务器端一直阻塞状态(同步的---安全性),执行效率低
三次握手,四次挥手!
3)共同点
UDP/TCP ---两端都需要有Socket(Socket编程)
应用协议
http协议
https协议(比上http协议)
第一要素:
ip地址
192.168.138.1: 使用点分十进制法
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码 (政府部门)
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码 (大学校园)
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码(私人地址)
127.0.0.1:回环地址:表示本机 ---- 域名:localhost
xxx.xxx.xxx.255 广播地址
第二个要素:端口号
使用360软件---查看当前计算机中每个软件 的端口号
有效端口号:0-65535
0-1024:保留端口号
http://www.baidu.com
http://192.168.25.1:80(可以不写)/xx
一般:80端口号:是不写的(省略)
常见端口号
tomcat: 8080
redis:6575.. (数据库---非关系型数据库 key-value )
mysql软件:3306
10.2)获取ip地址
package com.qianfeng_net_07;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName("10.12.156.36") ;
String ip = inetAddress.getHostAddress() ;
System.out.println(ip);
String name = inetAddress.getHostName() ;
System.out.println(name);
}
}
10.3)UDP协议发送端的步骤
package com.qianfeng_net_08;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket() ;
String s = "hello,udp,我来了" ;
byte[] bytes = s.getBytes() ;
int length = bytes.length ;
DatagramPacket dp = new DatagramPacket(bytes, length,
InetAddress.getByName("10.12.156.36"), 10086) ;
ds.send(dp);
ds.close();
}
}
10.4)UDP协议接收端的实现步骤
package com.qianfeng_net_08;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveDemo {
public static void main(String[] args) throws IOException{
DatagramSocket ds = new DatagramSocket(10086) ;
byte[] bytes = new byte[1024] ;
int length = bytes.length ;
DatagramPacket dp = new DatagramPacket(bytes, length) ;
ds.receive(dp);
byte[] buf = dp.getData() ;
int length2 = dp.getLength() ;
InetAddress address = dp.getAddress() ;
String ip = address.getHostAddress() ;
String s = new String(buf,0,length2) ;
System.out.println("data is: "+s+",from "+ip);
ds.close();
}
}
1.UDP发送端键盘录入数据,接收端不断接收数据(不关闭)
1.1)发送端键盘录入数据
package com.qianfeng.udp_01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket() ;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) ;
String line = null ;
while((line=br.readLine())!=null) {
if(line.equals("886")) {
break ;
}
byte[] bytes = line.getBytes() ;
int length = bytes.length ;
DatagramPacket dp = new DatagramPacket(
bytes,
length,
InetAddress.getByName("10.12.156.36"),
10000) ;
ds.send(dp);
}
ds.close();
}
}
1.2)接收端不断接收数据(不关闭)
package com.qianfeng.udp_01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10000) ;
while(true) {
byte[] bytes = new byte[1024] ;
int length = bytes.length ;
DatagramPacket dp = new DatagramPacket(bytes , length) ;
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength()) ;
String ip = dp.getAddress().getHostAddress() ;
System.out.println("data is :"+str+"from "+ip);
}
}
}
2.多线程:需要在一个窗口下进行聊天,发送和接收数据
2.1)多线程的实现
package com.qianfeng.udp_02;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ChatRoom {
public static void main(String[] args) {
try {
DatagramSocket sendDs = new DatagramSocket() ;
DatagramSocket receDs = new DatagramSocket(12306) ;
SendThread st = new SendThread(sendDs) ;
ReceiveThread rt = new ReceiveThread(receDs) ;
Thread t1 = new Thread(st) ;
Thread t2 = new Thread(rt) ;
t1.start();
t2.start();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
2.2)发送端的资源类
package com.qianfeng.udp_02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendThread implements Runnable {
private DatagramSocket ds ;
public SendThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if (line.equals("886")) {
break;
}
byte[] bytes = line.getBytes();
int length = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes, length,
InetAddress.getByName("10.12.156.36"), 12306);
ds.send(dp);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(ds!=null) {
ds.close();
}
}
}
}
2.3)接收端的资源类
package com.qianfeng.udp_02;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveThread implements Runnable {
private DatagramSocket ds ;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds ;
}
@Override
public void run() {
try {
while (true) {
byte[] bytes = new byte[1024];
int length = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes, length);
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength());
String ip = dp.getAddress().getHostAddress();
System.out.println("data is :" + str + "from " + ip);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.TCP/IP协议:发送接收数据
3.1)客户端的实现步骤(发送)
package com.qianfeng.tcp_03;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket("10.12.156.36", 8888) ;
OutputStream out = s.getOutputStream() ;
out.write("hello,TCP,我来了".getBytes());
s.close();
}
}
3.2)服务器端基本使用(接收)
package com.qianfeng.tcp_03;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888) ;
Socket s = ss.accept() ;
InputStream in = s.getInputStream() ;
byte[] bytes = new byte[1024] ;
int len = in.read(bytes) ;
String clienStr = new String(bytes,0,len) ;
String ip = s.getInetAddress().getHostAddress() ;
System.out.println("data is:"+clienStr+",from :"+ip);
ss.close();
}
}
4.客户端发送数据,服务端接收并反馈
4.1)客户端发送数据并接收反馈信息
package com.qianfeng.tcp_04;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.12.156.36",6666) ;
OutputStream out = socket.getOutputStream() ;
out.write("hello,Server,我来了".getBytes());
InputStream in = socket.getInputStream() ;
byte[] bytes = new byte[1024] ;
int len = in.read(bytes) ;
String serverStr = new String(bytes, 0, len) ;
System.out.println(serverStr);
socket.close();
}
}
4.2)服务器端还需要加入反馈操作,“我收到了”
package com.qianfeng.tcp_04;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666) ;
Socket socket = ss.accept() ;
InputStream in = socket.getInputStream() ;
byte[] bytes = new byte[1024] ;
int len = in.read(bytes) ;
String clientStr = new String(bytes, 0, len) ;
System.out.println(clientStr);
OutputStream out = socket.getOutputStream() ;
out.write("数据已经收到了".getBytes());
ss.close();
}
}
5键盘录入:BufferedReader:客户端发送,服务端不断将数据展示在控制台
5.1键盘录入客户端数据
package com.qianfeng.tcp_05;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.12.156.36", 2222) ;
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in)) ;
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())) ;
String line = null ;
while((line=br.readLine())!=null) {
if(line.equals("over")) {
break ;
}
bw.write(line);
bw.newLine();
bw.flush();
}
socket.close();
}
}
5.1键盘录入客户端数据
package com.qianfeng.tcp_05;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.12.156.36", 2222) ;
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in)) ;
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())) ;
String line = null ;
while((line=br.readLine())!=null) {
if(line.equals("over")) {
break ;
}
bw.write(line);
bw.newLine();
bw.flush();
}
socket.close();
}
}
5.2)服务器端不断将数据展示在控制台上
package com.qianfeng.tcp_05;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(2222) ;
Socket socket = ss.accept() ;
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
String line = null ;
while((line=br.readLine())!=null) {
System.out.println(line);
}
}
}
6.客户端不断键盘录入数据,服务器端将数据输出在某个文件中
6.1)客户端不断键盘录入数据
package com.qianfeng.tcp_06;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.12.156.36", 2222);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
if (line.equals("over")) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
socket.close();
}
}
6.2)服务器端将数据输出在某个文件中
package com.qianfeng.tcp_06;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(2222) ;
Socket socket = ss.accept() ;
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt")) ;
String line = null ;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
socket.close();
}
}
7客户端–服务端<–>文件复制读写(反馈信息)
7.1)客户端将文件(ReceiveDemo.java)写入通道流中
package com.qianfeng.tcp_08;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class UploadClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("10.12.156.36", 5555) ;
BufferedReader br = new BufferedReader
(new FileReader("ReceiveDemo.java")) ;
BufferedWriter bw =
new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())) ;
String line = null ;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
s.shutdownOutput();
BufferedReader br2 = new BufferedReader
(new InputStreamReader(s.getInputStream())) ;
String serverMsg = br2.readLine() ;
System.out.println(serverMsg);
br.close();
s.close();
}
}
7.2)服务端将通道流中的文件写入指定文件中(Copy.java),加上反馈信息
package com.qianfeng.tcp_08;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) throws IOException{
ServerSocket ss = new ServerSocket(5555) ;
Socket socket = ss.accept() ;
BufferedReader br = new BufferedReader
(new InputStreamReader(socket.getInputStream())) ;
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")) ;
String line = null ;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
BufferedWriter bw2 = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())) ;
bw2.write("文件复制完毕");
bw2.newLine();
bw2.flush();
bw.close();
socket.close();
}
}
8.客户端–服务端<–>图片复制读写(反馈信息)
8.1)客户端的一个图片文件:当前项目下xxx.jpg,写入通道流中
package com.qianfeng.tcp_09;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class UploadImageClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("10.12.156.36",6666) ;
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("高圆圆.jpg")) ;
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream()) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=bis.read(bytes))!=-1) {
bos.write(bytes, 0, len);
bos.flush();
}
s.shutdownOutput();
InputStream in = s.getInputStream() ;
byte[] bytes2 = new byte[1024] ;
int len2 = in.read(bytes2) ;
String fkMsg = new String(bytes2, 0, len2) ;
System.out.println("fkMsg:"+fkMsg);
bis.close();
s.close();
}
}
8.2)服务器端读取通道流中的图片,将图片文件:进行复制:mv.jpg
package com.qianfeng.tcp_09;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadImageServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666) ;
Socket socket = ss.accept() ;
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()) ;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mv.jpg")) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = bis.read(bytes))!=-1) {
bos.write(bytes, 0, len);
bos.flush();
}
OutputStream out = socket.getOutputStream() ;
out.write("图片已经复制完毕".getBytes());
out.flush();
bos.close();
socket.close();
}
}