关于java的网络编程,我在网上看了一些视频,学到了很多,然后就把学习到的东西总结起来。
简介
网络编程就是通过两台或多台主机之间的数据通信。想要实现这一目标,首先要在主机之间建立一条连接通道,然后按照事先规定好的格式(或者说规定的协议)进行数据传输,从而完成主机之间的信息传输。
TCP协议
TCP(Transmission Control Protocol)称为传输控制协议,是一种面向连接的可靠的传输协议。例如:QQ聊天
代码
这代码是我看视频里面的例子,我自己稍微有一些改动。
客户端
package com.ZXF.Net;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClientDemo1 {
public static void main(String[] args) {
Socket socket=null;
OutputStream os=null;
FileInputStream fis=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
//1.创建一个socket连接
socket=new Socket(InetAddress.getByName("127.0.0.1"),9000);
//2.创建一个输出流
os=socket.getOutputStream();
//3.读取文件
fis=new FileInputStream(new File("林允儿.jpg"));
//4.写出文件
byte[] buffer=new byte[1024];
int len=-1;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//通知服务端,我已结束
socket.shutdownOutput();//我已经传输完了
//确认服务器接收完成,才能断开连接
is=socket.getInputStream();
//由于服务发过来的确认信息是字符数组,所以创建数组管道流
baos=new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len2=-1;
while ((len2=is.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
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 (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket!=null){
try {
fis.close();
} catch (IOException e) {
}
}
}
}
}
服务端
package com.ZXF.Net;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo1 {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream in=null;
FileOutputStream fos=null;
OutputStream os=null;
try {
//1.创建连接
serverSocket=new ServerSocket(9000);
//2.监听客户端的连接
socket=serverSocket.accept();//阻塞式监听,会一直等待客户端连接,直到连接成功就关闭
//3.获取输入流
in=socket.getInputStream();
//文件输出
fos=new FileOutputStream(new File("copy.jpg"));
byte[] buffer=new byte[1024];
int len=-1;
while((len= in.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端我已接收完成
os=socket.getOutputStream();
os.write("我已经接收完成,你可以关闭连接了!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源,先开后关
if (os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in!=null){
try {
in.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();
}
}
}
}
}
TCP简单例子总结
1:服务端:
1.创建连接(serversocket)然后给出一个指定端口;
2.监听客户端的连接 socket.accept()方法;
3.获取输入流 socket.getInputStream()方法;
4.输入文件或者其他(直接运用io知识);
5.(可有可无的)通过io流输出信息在控制台通知程序员,已经结束传输;
6.(可有可无的)通过io流输出信息在控制台提示,已经结束传输;
7.关闭资源 先开后关原则;
2:客户端:
1.创建socket连接 然后给出指定IP和端口 socket(IP,port)
例如:Socket(InetAddress.getByName("127.0.0.1"),9000);
2.创建一个输出流 socket.getOutputStream();
3.读取文件 InputStream();
4.写出文件 正常io流操作;
5.通知服务端我已经传输完毕 socket.shutdownOutput();
6.关闭资源 先开后关原则。
UDP协议
UDP(User Datagram Protocol)称为用户数据报协议,是一种面向无连接的传输协议。例如:发短信、东风快递。
代码
这代码是我看视频里面的例子,我自己稍微有一些改动。
客户端(没有明确的概念)
package com.ZXF.Net;
import java.io.IOException;
import java.net.*;
//不需要连服务器
public class UdpClientDemo1 {
public static void main(String[] args) {
DatagramSocket socket= null;
try {
//1.创建一个socket连接
socket = new DatagramSocket();
//2.建个包
String msg="UDP,第一次尝试";
InetAddress localhost = InetAddress.getByName("localhost");
int port=9001;
//数据,数据长度起始、结束,发给谁
DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
//3.发送包
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (socket!=null){
//4.关闭源
socket.close();
}
}
}
}
服务端(没有明确的概念)
package com.ZXF.Net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpServerDemo1 {
public static void main(String[] args) {
DatagramSocket socket= null;
try {
//1.开放端口
socket = new DatagramSocket(9001);
//接收数据包
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(new String(packet.getData(),0, packet.getLength()));
} catch (Exception e) {
e.printStackTrace();
}finally {
if (socket!=null){
//关闭源
socket.close();
}
}
}
}
UDP简单例子总结
1:客户端(没有明确的概念):
1.创建一个socket连接(数据报 DatagramSocket)
2.建立一个需要发送的包(DatagramPacket)
确定把这个包发送给谁:DatagramPacket(包内容,0,包长度,地址,端口号);
例子:DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
3.发送包 socket.send(packet);
4.关闭资源
2:服务端(没有明确的概念):
1.开放端口 DatagramSocket(port);
2.接收包 DatagramPacket(包名,0,包长);
例:DatagramPacket(buffer,0,buffer.length);
3.阻塞接收 socket.receive(packet);
4.可以通过packet.get*()方法获取包的信息。
结语
细心的朋友可能会发现,我的代码有林允儿[手动狗头]
既然看到这里了,就看一下美女放松一下吧↓
本篇文章到这就结束了。每次在网上看视频,都会做一些笔记,如果各位有好的做笔记方式方法可以跟我交流交流,共同进步;如果这篇文章有可以优化的地方希望大佬指教指教。