• Java之网络编程


    本文主要介绍了网络编程中用户数据报协议UDP和传输控制协议,其中UDP是面向无连接的,传输效率高,安全性低,文中给出了通过socket实现UDP数据传输的过程。TCP是面向连接的传输协议,传输安全性较高,需要完成三次握手,文中给出了TCP客户端发送数据和服务器端接收数据的源代码,也介绍了多线程的方式实现TCP数据传输。

    目录

    1、UDP发送数据

    2、UDP接收数据

    3、UDP发送和接收数据实例

    4、TCP客户端发数据和服务器端接收数据

    5-TCP通信之多线程实现


    1、UDP发送数据

    1. import java.io.IOException;
    2. import java.net.*;
    3. public class NetworkDemo01 {
    4. public static void main(String[] args) throws IOException {
    5. //创建socket对象
    6. DatagramSocket ds = new DatagramSocket() ;
    7. //创建数据并打包
    8. byte [] bytes = "Hello Java".getBytes() ;
    9. DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.102.1"),10086) ;
    10. //使用socket对象发送数据
    11. ds.send(dp);
    12. //关闭资源
    13. ds.close();
    14. }
    15. }

    2、UDP接收数据

    1. import java.io.IOException;
    2. import java.net.DatagramPacket;
    3. import java.net.DatagramSocket;
    4. public class NetworkDemo02 {
    5. public static void main(String[] args) throws IOException {
    6. //根据端口号创建socket对象
    7. DatagramSocket ds = new DatagramSocket(10086) ;
    8. //打包接收对象
    9. byte[] bytes = new byte[1024] ;
    10. DatagramPacket dp = new DatagramPacket(bytes,bytes.length) ;
    11. ds.receive(dp) ;
    12. System.out.println("接收到的数据是:" + new String(dp.getData(),0,dp.getLength()));
    13. //释放资源
    14. ds.close();
    15. }
    16. }

    3、UDP发送和接收数据实例

    发送端socket程序:

    1. import java.io.*;
    2. import java.net.DatagramPacket;
    3. import java.net.DatagramSocket;
    4. import java.net.InetAddress;
    5. public class SendDemo01 {
    6. public static void main(String[] args) throws IOException {
    7. DatagramSocket ds = new DatagramSocket() ;
    8. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
    9. String line ;
    10. while((line=br.readLine()) != null){
    11. if(line.equals("886")){
    12. break ;
    13. }
    14. byte [] bytes = line.getBytes() ;
    15. DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.102.1"),10086) ;
    16. ds.send(dp);
    17. }
    18. ds.close();
    19. }
    20. }

    接收端socket程序:

    1. import java.io.IOException;
    2. import java.net.DatagramPacket;
    3. import java.net.DatagramSocket;
    4. public class ReceiveDemo {
    5. public static void main(String[] args) throws IOException {
    6. DatagramSocket ds = new DatagramSocket(10086) ;
    7. while(true) {
    8. byte[] bytes = new byte[1024];
    9. DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
    10. ds.receive(dp);
    11. System.out.println("接收到的数据是:" + new String(dp.getData(),0,dp.getLength()));
    12. }
    13. }
    14. }

    4、TCP客户端发数据和服务器端接收数据

    客户端程序:
     

    1. import java.io.IOException;
    2. import java.io.OutputStream;
    3. import java.net.Socket;
    4. public class ClientDemo01 {
    5. public static void main(String[] args) throws IOException {
    6. //获取客户端socket
    7. Socket socket = new Socket("192.168.102.1",10086) ;
    8. //获取输出流,写数据
    9. OutputStream os = socket.getOutputStream() ;
    10. os.write("hello java".getBytes());
    11. os.close();
    12. }
    13. }

    服务器端程序:

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.net.ServerSocket;
    4. import java.net.Socket;
    5. public class ServerDemo01 {
    6. public static void main(String[] args) throws IOException {
    7. ServerSocket ss = new ServerSocket(10086) ;
    8. //监听客户端,并用此套接字接收它
    9. Socket s = ss.accept() ;
    10. //获取输入流,读数据并显示在控制台
    11. InputStream is = s.getInputStream() ;
    12. byte [] bytes = new byte[1024] ;
    13. int len ;
    14. while((len=is.read(bytes)) != -1){
    15. System.out.println(new String(bytes,0,len));
    16. }
    17. ss.close();
    18. }
    19. }

    5-TCP通信之多线程实现

    客户端:首先读取文件数据,然后通过socket对象获取输出流发送数据到服务器,并接收服务器的反馈。

    1. import java.io.*;
    2. import java.net.Socket;
    3. public class ClientDemo02 {
    4. public static void main(String[] args) throws IOException {
    5. //创建客户端socket对象
    6. Socket s = new Socket("192.168.102.1",10086) ;
    7. //创建字符缓冲输出流和输入流
    8. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())) ;
    9. BufferedReader br = new BufferedReader(new FileReader("New\\src\\com\\learn\\java.txt")) ;
    10. //从文件读取并写入
    11. String line ;
    12. while((line=br.readLine()) != null){
    13. bw.write(line);
    14. bw.newLine();
    15. bw.flush();
    16. }
    17. s.shutdownOutput(); //提示服务器客户端发送完毕
    18. //接收服务器端的反馈
    19. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream())) ;
    20. String data = bufferedReader.readLine() ;
    21. System.out.println("服务器端的反馈为:" + data);
    22. br.close();
    23. s.close();
    24. }
    25. }

    服务器端:创建服务端套接字,并监听接收客户端信息,通过套接字对象创建服务器线程对象,并通过实现Runnable接口的方法启动线程。

    1. import java.io.IOException;
    2. import java.net.ServerSocket;
    3. import java.net.Socket;
    4. public class ServerDemo02 {
    5. public static void main(String[] args) throws IOException {
    6. ServerSocket serverSocket = new ServerSocket(10086) ;
    7. while(true){
    8. Socket s = serverSocket.accept() ;
    9. ServerThread serverThread = new ServerThread(s);
    10. Thread t = new Thread(serverThread) ;
    11. t.start();
    12. }
    13. }
    14. }

    服务器端线程实现方法:实现Runnable接口,并重写run()方法,该方法中包括套接字获取输入流接收文件和给予反馈。需要注意的是:防止文件命名冲突,需要设置文件是否存在判断,并做相应处理。

    1. import java.io.*;
    2. import java.net.Socket;
    3. public class ServerThread implements Runnable {
    4. private Socket s ;
    5. public ServerThread(Socket s) {
    6. this.s = s;
    7. }
    8. @Override
    9. public void run() {
    10. //服务器端接收文件,并写入到指定文件
    11. try{
    12. BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())) ;
    13. //解决命名冲突问题
    14. int count = 0 ;
    15. File file = new File("New\\src\\com\\my\\copy" +count + ".txt") ;
    16. while (file.exists()){
    17. count ++ ;
    18. file = new File("New\\src\\com\\my\\copy" +count + ".txt") ;
    19. }
    20. BufferedWriter bw = new BufferedWriter(new FileWriter(file)) ;
    21. String line ;
    22. while((line=br.readLine()) != null){
    23. bw.write(line);
    24. bw.newLine();
    25. bw.flush();
    26. }
    27. //给出文件接收成功反馈
    28. BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())) ;
    29. bufferedWriter.write("文件上传成功");
    30. bufferedWriter.newLine();
    31. bufferedWriter.flush();
    32. s.close();
    33. }catch (IOException e){
    34. e.printStackTrace();
    35. }
    36. }
    37. }
  • 相关阅读:
    自学的一些面试题-html
    【21天学习挑战赛】图像的旋转问题(二维数组)
    恒运资本:银行股适合定投吗?为什么银行股适合定投?
    404. 左叶子之和
    单线程介绍、ECMAScript介绍、操作系统Windows、Linux 和 macOS
    内存-虚拟地址到物理内存地址转换
    考研政治---马克思主义基本原理概论---辩证法
    达梦数据库-日期类型常用函数汇总
    请求数据,后台返回上千条上万条数据,怎么办
    [附源码]计算机毕业设计JAVA本科毕业设计过程管理系统
  • 原文地址:https://blog.csdn.net/nuist_NJUPT/article/details/126200700