网络编程
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
1.网络通信的要素
通信双方的地址:ip,端口号
IP就是一个电脑节点的网络物理地址,端口是该计算机逻辑通讯接口。IP和端口号组成了你的网络地址
网络通信的协议
2.ip地址
127.0.0.1 本机localhost
ip地址的分类
ipv4 127.0.0.1 四个字节 0-255 ,42亿
ipv6 128位,8个无符号整数
公网(互联网)/私网(区域网) :ABCD类(了解即可)
3.端口
计算机一个程序的进程,不同的进程不同的端口号,用于区分软件,单个协议下端口号不能重合
规定为0-65535
TCP,UDP
端口分类
公有0-1023 http:80
程序注册端口:2014-49151 MySQL:3306
动态,私有 :49152-65535
查询:netstat -ano #查询所有端口,netstat -ano|findstr"" #查询特定端口
4.通信协议
TCP/IP协议簇
重要:TCP:用户传输协议,UDP:用户数据协议
TCP:连接,稳定,三次握手,四次挥手,客户端,服务端,传输完成释放链接效率低
5.TCP实现聊天
服务端
package neww;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
//首先有一个地址
serverSocket = new ServerSocket(9999);
//等待客户端连接
socket=serverSocket.accept();
//读取客户端信息
is= socket.getInputStream();
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
}catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if(baos!=null) {
try {
baos.close();
}catch (IOException e){
e.printStackTrace();;
}
}
if(is!=null) {
try {
is.close();
}catch (IOException e){
e.printStackTrace();;
}
}
if(socket!=null) {
try {
socket.close();
}catch (IOException e){
e.printStackTrace();;
}
}
if(serverSocket!=null) {
try {
serverSocket.close();
}catch (IOException e){
e.printStackTrace();;
}
}
}
}
}
客户端
import org.omg.CORBA.UNKNOWN;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class TcpClientDemo01 {
public static void main(String[] args){
Socket socket=null;
OutputStream os=null;
try{
//要知道服务器的地址
InetAddress serverIP=InetAddress.getByName("127.0.0.1");
//端口号
int port=9999;
//创建一个socket连接
socket=new Socket(serverIP,port);
//发送消息IO流
os=socket.getOutputStream();
os.write("你好".getBytes());
}catch (Exception e){
e.printStackTrace();
}finally {
if(os!=null);{
try{
os.close();
}catch (IOException e){
e.printStackTrace();
}
}
if(socket!=null);{
try{
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
6.TCP文件上传实现
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo02 {
public static void main(String[] args)throws Exception{
//1.创建服务
ServerSocket serverSocket=new ServerSocket(9000);
//2.监听客户端的连接
Socket socket=serverSocket.accept(); //阻塞式监听
//3.获取输入流
InputStream is=socket.getInputStream();
//4.文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while((len= is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//5.通知客户端我接受完毕
OutputStream os=socket.getOutputStream();
os.write("我接受完毕,可以断开".getBytes());
//6.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
客户端
package neww;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClientDemo02 {
public static void main(String[] args) throws Exception{
//创建一个Socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//创建一个输出流
OutputStream os = socket.getOutputStream();
//读取文件
FileInputStream fis = new FileInputStream(new File("1.jpg.jpg"));
//写出文件
byte[] buffer=new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//通知服务器我已经传输完
socket.shutdownOutput();
//确定服务器接受完毕,断开连接,管道流
InputStream inputStream=socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len2;
while((len2=inputStream.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
//关闭资源
baos.close();
inputStream.close();
fis.close();
os.close();
socket.close();
}
}
8.UDP消息发送
不需要连接,只需要知道对方地址
服务端
import com.sun.org.apache.xpath.internal.operations.String;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpserverDemo01 {
//还要等待客户端连接
public static void main(String[] args) throws Exception{
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接受数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet); //阻塞接受
System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getData().toString());
//关闭连接
socket.close();
}
}
客户端
package neww;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//不需要建立服务器
public class UdpClientDemo01 {
public static void main(String[] args) throws Exception{
//1.建立一个socket
DatagramSocket socket =new DatagramSocket();
//2.建立一个包
String msg="你好,服务器";
//发送给谁
InetAddress localhost =InetAddress.getByName("localhost");
int port=9090;
DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
//发送包
socket.send(packet);
//关闭流
socket.close();
}
}
9.UDP聊天
sender
package chat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception{
DatagramSocket socket=new DatagramSocket(8888);
//准备数据,控制台读取System.in
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
while(true) {
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,new InetSocketAddress("localhost",6666));
socket.send(packet);
}
}
}
receieve
package chat;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceieveDemo01 {
public static void main(String[] args) throws Exception{
DatagramSocket socket=new DatagramSocket(6666);
while(true){
byte[] container =new byte[1024];
DatagramPacket packet=new DatagramPacket(container,0,container.length);
socket.receive(packet); //阻塞式接包
//断开连接
byte[] data= packet.getData();
String receiveData =new String(data, 0, data.length);
System.out.println(receiveData);
if(receiveData.equals("bye")){
break;
}
}
socket.close();
}
}
、
IO流
掌握InputStream和Reader,OutputStream和Writer
以及转换流