网络编程,IO流
网络编程
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
1.网络通信的要素
通信双方的地址:ip,端口号
IP就是一个电脑节点的网络物理地址,端口是该计算机逻辑通讯接口。IP和端口号组成了你的网络地址
网络通信的协议
重点:传输层TCP/UDP
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:连接,稳定,三次握手,四次挥手,客户端,服务端,传输完成释放链接效率低
UDP:不连接,不稳定,客户端与服务端没有明确的界限
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.建立一个socketDatagramSocket 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.inBufferedReader 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
以及转换流