Java网络编程(客户端/服务器,信息共享,文件上传)

java实现文件传输(附完整源码) 阅读详情

一、TCP/IP协议

  既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输。这里就要使用到TCP/IP协议。

  TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成。IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机。TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象。

二、TCP与UDP

  TCP是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。

  UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

TCP与UDP区别:

TCP特点:

  1、TCP是面向连接的协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接协议,所以只能用于点对点的通讯。而且建立连接也需要消耗时间和开销。

  2、TCP传输数据无大小限制,进行大数据传输。

  3、TCP是一个可靠的协议,它能保证接收方能够完整正确地接收到发送方发送的全部数据。

UDP特点:

  1、UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

  2、UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。

  3、UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

TCP与UDP应用:

  1、TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。

  2,UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
  

三、Socket是什么

  Socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号唯一确定。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 Socket是TCP/IP协议的一个十分流行的编程界面,但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

  Socket通讯过程:服务端监听某个端口是否有连接请求,客户端向服务端发送连接请求,服务端收到连接请求向客户端发出接收消息,这样一个连接就建立起来了。客户端和服务端都可以相互发送消息与对方进行通讯。

  Socket的基本工作过程包含以下四个步骤:

  1、创建Socket;

  2、打开连接到Socket的输入输出流;

  3、按照一定的协议对Socket进行读写操作;

  4、关闭Socket。

四、Java中的Socket

  在java.net包下有两个类:Socket和ServerSocket。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

列出几个常用的构造方法:

Socket(InetAddress address,int port);//创建一个流套接字并将其连接到指定 IP 地址的指定端口号

Socket(String host,int port);//创建一个流套接字并将其连接到指定主机上的指定端口号

Socket(InetAddress address,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程地址上的指定远程端口

Socket(String host,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程主机上的指定远程端口

Socket(SocketImpl impl);//使用用户指定的 SocketImpl 创建一个未连接 Socket

ServerSocket(int port);//创建绑定到特定端口的服务器套接字

ServerSocket(int port,int backlog);//利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号

ServerSocket(int port,int backlog, InetAddress bindAddr);//使用指定的端口、侦听 backlog 和要绑定到的本地 IP地址创建服务器

构造方法的参数中,address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可以用来创建Socket。count则表示服务端所能支持的最大连接数。

注意:必须小心选择端口号。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。

几个重要的Socke方法:

public InputStream getInputStream();//方法获得网络连接输入,同时返回一个IutputStream对象实例

public OutputStream getOutputStream();//方法连接的另一端将得到输入,同时返回一个OutputStream对象实例

public Socket accept();//用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。

“阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续;通常”阻塞”是由循环产生的。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

五、基本的Client/Server程序

以下是一个基本的客户端/服务器端程序代码。主要实现了服务器端一直监听某个端口,等待客户端连接请求。客户端根据IP地址和端口号连接服务器端,从键盘上输入一行信息,发送到服务器端,然后接收服务器端返回的信息,最后结束会话。这个程序一次只能接受一个客户连接。

ps:这个小例子写好后,服务端一直接收不到消息,调试了好长时间,才发现误使用了PrintWriter的print()方法,而BufferedReader的readLine()方法一直没有遇到换行,所以一直等待读取。我晕死~~@_@

客户端程序:

package soket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author zy
 * @Desciption:
 * @Date 2018-1-26 11:10
 */
public class SocketClient {
    public static void main(String[] args) {
       try{
        /** 创建Socket*/
        // 创建一个流套接字并将其连接到指定 IP 地址的指定端口号(本处是本机)
           Socket socket = new Socket("127.0.0.1",2018);
           socket.setSoTimeout(60000);
        /** 发送客户端准备传输的信息 */
          // 由Socket对象得到输出流,并构造PrintWriter对象
           PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
           // 将输入读入的字符串输出到Server
           BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));

           printWriter.print(buff.readLine());
           // 刷新输出流,使Server马上收到该字符串
           printWriter.flush();

           BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            /** 用于获取服务端传输来的信息 */
            // 由Socket对象得到输入流,并构造相应的BufferedReader对象
           String result = bufferedReader.readLine();
           // 输入读入一字符串
           System.out.println("Server say:" + result);
             /** 关闭Socket*/
           printWriter.close();
           buff.close();
           bufferedReader.close();
           socket.close();
       }catch (Exception e){
           System.out.println("Exception:" + e);
       }

    }
}

服务器端程序:

package soket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author medo_zy
 * @Desciption:
 * @Date 2018-1-26 11:18
 */

public class SocketServer {
    public static void main(String[] args) {
        try {
            /** 创建ServerSocket*/
            // 创建一个ServerSocket在端口2018监听客户请求
            ServerSocket serverSocket =new ServerSocket(2018);
            while (true) {
                // 侦听并接受到此Socket的连接,请求到来则产生一个Socket对象,并继续执行
                Socket socket = serverSocket.accept();

                /** 获取客户端传来的信息 */
                // 由Socket对象得到输入流,并构造相应的BufferedReader对象
                BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 获取从客户端读入的字符串
                String result = bufferedReader.readLine();
                System.out.println("Client say : " + result);

                /** 发送服务端准备传输的 */
                // 由Socket对象得到输出流,并构造PrintWriter对象
                PrintWriter printWriter =new PrintWriter(socket.getOutputStream());
                printWriter.print("hello Client, I am Server!");
                printWriter.flush();

                /** 关闭Socket*/
                printWriter.close();
                bufferedReader.close();
                socket.close();
            }
        }catch (Exception e) {
            System.out.println("Exception:" + e);
        }finally{
//          serverSocket.close();
        }
    }
}

六、多客户端连接服务器

上面的服务器端程序一次只能连接一个客户端,这在实际应用中显然是不可能的。通常的网络环境是多个客户端连接到某个主机进行通讯,所以我们要对上面的程序进行改造。

设计思路:服务器端主程序监听某一个端口,客户端发起连接请求,服务器端主程序接收请求,同时构造一个线程类,用于接管会话。当一个Socket会话产生后,这个会话就会交给线程进行处理,主程序继续进行监听。

下面的实现程序流程是:客户端和服务器建立连接,客户端发送消息,服务端根据消息进行处理并返回消息,若客户端申请关闭,则服务器关闭此连接,双方通讯结束。

客户端程序:

package soket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author medo_zy
 * @Desciption:
 * @Date 2018-1-26 14:07
 */
public class MultiSocketClient {

    public static void main(String[] args) {
        try{

            Socket socket = new Socket("127.0.0.1",2018);
            socket.setSoTimeout(60000);

            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String result = "";
            while(result.indexOf("bye") == -1){
                BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(System.in));
                printWriter.println(bufferedReader1.readLine());
                printWriter.flush();

                result = bufferedReader.readLine();
                System.out.println("Server say:" + result);

            }
            printWriter.close();
            bufferedReader.close();
            socket.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

服务器端程序:

package soket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author medo_zy
 * @Desciption:
 * @Date 2018-1-26 14:18
 */
public class MultiSocketServer extends ServerSocket {

    private static final int SERVER_PORT =2018;

    public MultiSocketServer() throws IOException {
        super(SERVER_PORT);
        try{
            while(true){
                Socket socket = accept();
                new CreateServerThread(socket);
            }
        }catch (Exception e){

        }finally {
            close();
        }
    }

    class CreateServerThread extends Thread{
        private Socket client;
        private BufferedReader bufferedReader;
        private PrintWriter printWriter;

        public CreateServerThread(Socket s) throws IOException{

            client = s ;
            bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));

            printWriter = new PrintWriter(client.getOutputStream(),true);
            System.out.println("Client("+getName()+") come in...");

            start();
        }
        public synchronized void run(){
            try{
                for(int i = 0;;i++){
                    System.out.println(i);
                    String line = bufferedReader.readLine();
                    while(!line.equals("bye")){
                        printWriter.println("continue,clinet("+getName()+")!");
                        line = bufferedReader.readLine();
                        System.out.println("Client("+getName()+")!");
                    }
                    printWriter.println("bye,Clinet("+getName()+")!");

                    System.out.println("Client("+getName()+") exit!");
                    printWriter.close();
                    bufferedReader.close();
                    client.close();
                }
            }catch ( Exception e){

            }
        }
    }
    public static void main(String[] args) throws IOException {
        new MultiSocketServer();
    }
}

七、信息共享

以上虽然实现了多个客户端和服务器连接,但是仍然是消息在一个客户端和服务器之间相互传播。现在我们要实现信息共享,即服务器可以向多个客户端发送广播消息,客户端也可以向其他客户端发送消息。类似于聊天室的那种功能,实现信息能在多个客户端之间共享。

设计思路:客户端循环可以不停输入向服务器发送消息,并且启一个线程,专门用来监听服务器端发来的消息并打印输出。服务器端启动时,启动一个监听何时需要向客户端发送消息的线程。每次接受客户端连接请求,都启一个线程进行处理,并且将客户端信息存放到公共集合中。当客户端发送消息时,服务器端将消息顺序存入队列中,当需要输出时,从队列中取出广播到各客户端处。客户端输入showuser命令可以查看在线用户列表,输入bye向服务器端申请退出连接。

PS:以下代码在测试时发现了一个中文乱码小问题,当文件设置UTF-8编码时,无论怎样在代码中设置输入流编码都不起作用,输入中文仍然会乱码。把文件设置为GBK编码后,不用在代码中设置输入流编码都能正常显示传输中文。

客户端代码:

package soket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author medo_zy
 * @Desciption:
 * @Date 2018-1-26 15:26
 */
public class ShareSocketClient extends Socket {

    private static final String SERVER_IP ="127.0.0.1";
    private static final int SERVER_PORT =2018;

    private Socket client;
    private PrintWriter out;
    private BufferedReader in;

    public ShareSocketClient() throws Exception{
        super(SERVER_IP,SERVER_PORT);
        client = this;
        out = new PrintWriter(this.getOutputStream(),true);
        in = new BufferedReader(new InputStreamReader(this.getInputStream()));
        new ReadLineThread();

        while(true){
            in = new BufferedReader(new InputStreamReader(System.in));
            String input = in.readLine();
            out.println(input);
        }
    }

    class ReadLineThread extends Thread{

        private BufferedReader buff;
        public ReadLineThread(){
            try {
                buff = new BufferedReader(new InputStreamReader(client.getInputStream()));
                start();
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void  run(){
            try{
               while (true){
                   String result = buff.readLine();
                   if("byeClinet".equals(result)){
                       break;
                   }else {
                       System.out.println(result);
                   }
               }
                in.close();
                out.close();
                client.close();
            }catch ( Exception e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            new ShareSocketClient();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

服务器端代码:

package soket;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author medo_zy
 * @Desciption:
 * @Date 2018-1-26 15:36
 */
public class ShareSocketServer extends ServerSocket {

    private static final int SERVER_PORT =2018;

    private static boolean isPrint =false;//是否输出消息标志
    private static List user_list =new ArrayList();//登录用户集合
    private static List<ServerThread> thread_list =new ArrayList<ServerThread>();//服务器已启用线程集合
    private static LinkedList<String> message_list =new LinkedList<String>();//存放消息队列

    /**
     * 创建服务端Socket,创建向客户端发送消息线程,监听客户端请求并处理
     */
    public ShareSocketServer()throws IOException{
        super(SERVER_PORT);//创建ServerSocket
        new PrintOutThread();//创建向客户端发送消息线程

        try {
            while(true){//监听客户端请求,启个线程处理
                Socket socket = accept();
                new ServerThread(socket);
            }
        }catch (Exception e) {
        }finally{
            close();
        }
    }

    /**
     * 监听是否有输出消息请求线程类,向客户端发送消息
     */
    class PrintOutThread extends Thread{

        public PrintOutThread(){
            start();
        }

        @Override
        public void run() {
            while(true){
                if(isPrint){//将缓存在队列中的消息按顺序发送到各客户端,并从队列中清除。
                    String message = message_list.getFirst();
                    for (ServerThread thread : thread_list) {
                        thread.sendMessage(message);
                    }
                    message_list.removeFirst();
                    isPrint = message_list.size() >0 ?true :false;
                }
            }
        }
    }

    /**
     * 服务器线程类
     */
    class ServerThread extends Thread{
        private Socket client;
        private PrintWriter out;
        private BufferedReader in;
        private String name;

        public ServerThread(Socket s)throws IOException{
            client = s;
            out =new PrintWriter(client.getOutputStream(),true);
            in =new BufferedReader(new InputStreamReader(client.getInputStream()));
            in.readLine();
            out.println("成功连上聊天室,请输入你的名字:");
            start();
        }

        @Override
        public void run() {
            try {
                int flag =0;
                String line = in.readLine();
                while(!"bye".equals(line)){
                    //查看在线用户列表
                    if ("showuser".equals(line)) {
                        out.println(this.listOnlineUsers());
                        line = in.readLine();
                    }
                    //第一次进入,保存名字
                    if(flag++ ==0){
                        name = line;
                        user_list.add(name);
                        thread_list.add(this);
                        out.println(name +"你好,可以开始聊天了...");
                        this.pushMessage("Client<" + name +">进入聊天室...");
                    }else{
                        this.pushMessage("Client<" + name +"> say : " + line);
                    }
                    line = in.readLine();
                }
                out.println("byeClient");
            }catch (Exception e) {
                e.printStackTrace();
            }finally{//用户退出聊天室
                try {
                    client.close();
                }catch (IOException e) {
                    e.printStackTrace();
                }
                thread_list.remove(this);
                user_list.remove(name);
                pushMessage("Client<" + name +">退出了聊天室");
            }
        }

        //放入消息队列末尾,准备发送给客户端
        private void pushMessage(String msg){
            message_list.addLast(msg);
            isPrint =true;
        }

        //向客户端发送一条消息
        private void sendMessage(String msg){
            out.println(msg);
        }

        //统计在线用户列表
        private String listOnlineUsers() {
            String s ="--- 在线用户列表 ---\015\012";
            for (int i =0; i < user_list.size(); i++) {
                s +="[" + user_list.get(i) +"]\015\012";
            }
            s +="--------------------";
            return s;
        }
    }

    public static void main(String[] args)throws IOException {
        new ShareSocketServer();//启动服务端
    }
}

class ServerThread extends Thread {
    public ServerThread(Socket s) throws IOException {
    }
}

八、文件传输

客户端向服务器端传送文件,服务端可获取文件名用于保存,获取文件大小计算传输进度,比较简单,直接贴代码。

客户端代码:

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;

/**
 * 客户端
 */
public class Client extends Socket{

    private static final String SERVER_IP ="127.0.0.1";
    private static final int SERVER_PORT =2013;

    private Socket client;
    private FileInputStream fis;
    private DataOutputStream dos;

    public Client(){
        try {
            try {
                client =new Socket(SERVER_IP, SERVER_PORT);
                //向服务端传送文件
                File file =new File("c:/test.doc");
                fis =new FileInputStream(file);
                dos =new DataOutputStream(client.getOutputStream());

                //文件名和长度
                dos.writeUTF(file.getName());
                dos.flush();
                dos.writeLong(file.length());
                dos.flush();

                //传输文件
                byte[] sendBytes =new byte[1024];
                int length =0;
                while((length = fis.read(sendBytes,0, sendBytes.length)) >0){
                    dos.write(sendBytes,0, length);
                    dos.flush();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                if(fis !=null)
                    fis.close();
                if(dos !=null)
                    dos.close();
                client.close();
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args)throws Exception {
        new Client();
    }
}

服务器端代码:

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器
 */
public class Server extends ServerSocket{

    private static final int PORT =2013;

    private ServerSocket server;
    private Socket client;
    private DataInputStream dis;
    private FileOutputStream fos;

    public Server()throws Exception{
        try {
            try {
                server =new ServerSocket(PORT);

                while(true){
                    client = server.accept();

                    dis =new DataInputStream(client.getInputStream());
                    //文件名和长度
                    String fileName = dis.readUTF();
                    long fileLength = dis.readLong();
                    fos =new FileOutputStream(new File("d:/" + fileName));

                    byte[] sendBytes =new byte[1024];
                    int transLen =0;
                    System.out.println("----开始接收文件<" + fileName +">,文件大小为<" + fileLength +">----");
                    while(true){
                        int read =0;
                        read = dis.read(sendBytes);
                        if(read == -1)
                            break;
                        transLen += read;
                        System.out.println("接收文件进度" +100 * transLen/fileLength +"%...");
                        fos.write(sendBytes,0, read);
                        fos.flush();
                    }
                    System.out.println("----接收文件<" + fileName +">成功-------");
                    client.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(dis !=null)
                    dis.close();
                if(fos !=null)
                    fos.close();
                server.close();
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args)throws Exception {
        new Server();
    }
}
Java实现文件传输 在Java编程中,我们可以使用各种方法实现文件传输。文件传输是将文件从一个位置传输到另一个位置的过程,可以用于各种应用场景,如文件备份、文件共享等。下面我将介绍一种基于Socket的Java文件传输实现方法。首先,我们需要建立一个服务器和一个客户端来进行文件传输。服务器将监听来自客户端的连接请求,并接收文件数据,而客户端将连接到服务器并发送文件数据。客户端连接到服务器后,将指定的文件数据发送给服务器。在实际应用中,你可能需要添加更多的错误处理和安全性措施,例如校验文件完整性、处理并发连接等。 阅读详情

相关推荐

springboot农业产业链追溯系统-计算机毕业设计源码72527

(1)首页:展示天气预报、农业资讯等信息,提供快速入口到各功能模块。 (2)病虫害防治:提供病虫害识别、防治方法和产品推荐,帮助用户有效预防和处理病虫害问题。 (3)农业新闻:发布最新的农业新闻、政策和市场动态,保持用户对行业信息的关注。 (4)种植计划:用户可制定详细的种植计划,包括种植时间、作物品种、数量、面积等,系统提供种植指导和智能推荐。 (5)提醒信息:定期发送作业提醒、天气预警等信息,帮助用户合理安排农业生产活动。 (6)作业记录:记录用户的作业过程,包括工作时间、作物生长情况、操作内容和结果评

Biye_Design的博客 251

Java网络编程 ServeSocket、Socket 方法 setSoTimeout() 详解

Java网络编程 ServeSocket、Socket 方法 setSoTimeout() 详解

csdn_bajie 4022

java写的局域网文件传输系统

java写的局域网文件传输系统,j2se的简单应用

socket setSoTimeout方法

做网络编程的人对setSoTimeout方法一定很熟悉,都知道是设置连接的超时时间! 但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间!我看了一下JDK 关于这个方法的说明,其实根本不是链路的超时时间!   Java代码   setSoTimeout  public void setSoTimeout(int timeout)      thr

qq_23013625的博客 4万+

6.5 构网型储能系统的协同控制策略

本文系统阐述了构网型储能系统的协同控制策略,重点分析了多机组群协同运行面临的功率分配不均、动态响应失配等挑战。研究提出了改进型下垂控制与虚拟阻抗法、基于一致性算法的分布式协同控制等解决方案,探讨了构网型储能与同步发电机在惯性响应、一次调频等方面的协同机制,以及与跟网型电源在电压支撑、阻抗重塑等方面的互补作用。文章构建了分层控制架构,为实现多类型电源的全局优化运行提供了技术路径,对提升高比例新能源电力系统的稳定性具有重要意义。

技术工作者 1005

解锁全志T113-i隐藏技能:用RISC-V核跑实时系统比STM32还稳?

本文深入探讨了全志T113-i SoC的异构架构潜力,重点解析如何利用其内置的玄铁C906 RISC-V核心独立运行实时系统。通过对比传统MCU与Linux方案,文章提供了从RISC-V核心启动、FreeRTOS移植到与Linux主核进行高效异构通信的完整实战指南,为工控等需要兼顾丰富应用与硬实时控制的场景提供了高集成度的单芯片解决方案。

ansible6ops的博客 495

循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

循序渐进Java Socket网络编程(多客户端、信息共享、文件传输) 原文地址 http://www.cnblogs.com/hellojava/archive/2013/01/25/2861127.html 目录[-] 一、TCP/IP协议 二、TCP与UDP 三、Socket是什么 四、Java中的Socket 五、基本的Client/Server程序

qq_27012285的博客 535

matlab相机标定_实战 | 相机标定

点击“计算机视觉life”关注,置顶更快接收消息!本文阅读时间约5分钟什么是相机标定?我们为什么需要相机标定?相机标定就是确定相机内参和外参的过程,其结果精度会直接影响视觉系统后续工作的准确性。坐标系相机标定涉及到了四大坐标系,分别为:像素坐标系图像物理坐标系相机坐标系世界坐标系为了进行相机标定,必须已知世界坐标系中足够多的三维空间点坐标,找到这些空间点在图像中投影点的二维图像坐标,并建...

weixin_39747334的博客 765

Java网络编程、正则表达式、单例设计模式与Lombok

UDP协议:UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,主要用于提供不可靠但高效的网络数据传输服务无连接UDP在发送数据之前不需要先建立连接,也不需要在数据传输完成后关闭连接。这意味着UDP可以立即开始发送数据,适用于实时应用,如在线语音聊天、视频流媒体等不可靠UDP不保证数据报文的可靠传输。数据报可能丢失、重复或乱序到达,也不会有重传机制。对于不需要可靠传输的应用场景,UDP提供了更快的速度无序传输。

小何代码咖啡馆 1464

安装Quartus-II 13 和Modelsim

目录一、Quartus-II安装1.Quartus-II 13下载2.Quartus-II 13安装3.Quartus-II 13注册二、Modelsim安装 实验目的:安装Quartus-II 13 和Modelsim 实验环境:Windows10 参考资料:Quartus-II安装及使用 一、Quartus-II安装 1.Quartus-II 13下载 正点原子官方资料下载 百度网盘下载链接: https://pan.baidu.com/s/1a9d-bq9RZmWrRV542X4IEA 提取码:

qqq080的博客 8639

Spark Catalog详解

旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗?我:你应该静下心来好好把spark基础知识进行全面学习。实习生:难道spark有这功能,而我没有学习过?咋弄啊?我:学习一下Spark Catalog。实习生:啥是Catalog啊?Spark Catalog是Spark SQL中的一个元数据管理组件,它提供了一个集中化的存储和查询表、视图和函数的位置。

SunnyRivers 1815

基于SSM企业级OA系统的设计与实现-计算机毕设 【课程设计】 18672

平台用户功能 (1)注册登录:新用户可以通过注册成为系统用户,注册后可以用账号密码登录系统。 (2)首页:用户可以查看首页展示的轮播图、通知公告、新闻资讯等信息并可以进行相关操作。 (3)通知公告:用户可以查看系统发布的通知公告、关于我们、联系方式、网站介绍等信息。 (4)新闻资讯:用户可以查看新闻资讯列表中某个资讯信息的详情并可以进行点赞、收藏和发表评论操作。 (5)文档信息:用户可以查看文档信息列表中某个文档信息的详情并可以进行点赞、收藏和发表评论操作。 (6)即时通讯:用户点击导航栏的“即时通讯”进入

WeiXin_DZbishe的博客 875

GoAnywhere MFT 身份验证绕过漏洞(CVE-2024-0204)

GoAnywhere MFT 身份验证绕过漏洞(CVE-2024-0204)

weixin_43567873的博客 387

【课程设计】阳光集团电子产品管理系统的设计与实现 计算机毕业设计源码39406

系统功能分为管理员和员工两类用户角色,其中管理员拥有全面的权限,负责对系统用户、供应商、产品类型、销售和采购记录进行管理,确保系统的数据准确性和业务流程的顺畅;员工用户则主要负责添加销售与采购记录,便于日常业务的执行。系统通过简洁直观的界面设计和高效的数据处理方式,提升了电子产品管理的便捷性和精确度。 本系统的实现为阳光集团提供了一个可靠的电子产品管理解决方案,不仅提升了管理效率,还促进了企业信息化进程。系统的设计和实现为其他企业在数字化转型过程中提供了有益的参考...

高级程序源的博客 729

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 158

【课程设计】SSM毕业生分配系统-计算机毕业设计源码32053

(二) 1.用户管理模块:涵盖注册、登录、信息管理和权限管理。用户通过学号/工号和初始密码注册,登录系统支持密码记忆与找回。管理员可管理用户信息,分配权限。 2.毕业生信息管理模块: 个人信息管理:学生填写基本信息,管理员批量导入。 去向信息填报:学生选择毕业去向并填写详细信息,上传证明材料。去向包括就业、升学、出国等,学生可修改删除。 去向信息审核:教师审核学生去向信息,可补充修改,结果分为通过、驳回和待审核。 证明材料管理:学生上传、下载、删除证明材料,教师和管理员可查看下载。

Biye_Design的博客 766

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

(课程设计)基于SpringBoot的流浪动物救助及领养系统-计算机毕设 附源码43600

前端领养用户模块: (1)注册登录:用户可以通过注册功能创建新账户,输入必要的信息如用户名、密码、邮箱等。登录功能允许用户使用已注册的凭证登录系统,以便访问个人账户和领养服务。 (2)首页:首页展示宠物资讯、领养中心推荐和宠物教学推荐。用户可以收藏喜欢的内容,系统将优先推荐这些类型的资讯和教学,以提升用户体验。 (3)公告信息:此部分提供最新的平台公告和通知,让用户了解领养中心的最新动态、活动信息以及任何重要更新。 (4)宠物资讯:用户可以浏览各种宠物相关资讯,并对喜欢的文章进行点赞、收藏和评论。这些互动功

ID3461074420的博客 189

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【课程设计】基于SSM的宠物医院小程序设计与实现 计算机毕业设计源码01004

小程序针对不同用户角色注册用户、医生及管理员,提供了定制化的功能和服务。注册用户可通过小程序查看医院公告、医生信息,进行在线咨询服务以及预约挂号等操作,医生用户则能管理个人信息、查看和回复在线咨询、处理预约挂号请求并记录诊疗过程;而管理员被赋予了对系统进行全面管理的权利,包括但不限于用户管理、医生信息维护、预约挂号和诊疗记录的监督等。系统还集成了宠物档案管理功能,方便用户和医生随时查阅宠物健康状况。整个系统的实现不仅优化了宠物医疗资源的配置和使用效率,同时也提升了用户体验,为宠物主人和医疗服务提供者搭建了一

专业程序开发源的博客 5857

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基于Spring Boot的校园志愿者服务系统的设计与实现 计算机毕业设计源码74936

系统采用Java语言开发,结合MySQL数据库进行数据存储与管理,具备良好的扩展性和稳定性。针对学生用户,系统提供了志愿者活动的浏览、报名、活动评价等功能,方便学生积极参与校园志愿服务并记录个人服务经历。对于管理员,系统实现了活动发布、志愿培训管理、活动审核、数据统计与查询等核心功能,便于对校园志愿者活动进行全面高效的管理...

Biye_Design的博客 259

基于Spring Boot与Vue的水果销售系统的设计与实现-计算机毕设 【课程设计】12720

前端注册用户模块: (1)注册登录:注册和登录是用户进入系统的门户,它们是用户与系统交互的首要步骤。注册功能允许新用户创建账户,而登录功能则允许已注册用户进入他们的个人空间。 (2)首页:首页是用户进入平台后首先看到的页面,它为用户提供了一个直观的界面,展示平台的核心内容和功能。首页包括水果资讯和水果商城的推荐商品。首页的设计吸引用户深入浏览,提供丰富的信息和便捷的入口,让用户能够快速找到他们感兴趣的内容或商品。 (3)公告信息:公告信息模块是平台与用户沟通的重要渠道,用于发布最新的平台通知、活动信息、政策

WeiXin_DZbishe的博客 1770

HttpClient的setConnectionRequestTimeout、setConnectTimeout、setSocketTimeout设置注意事项

/hc.apache.org/index.html)是我们java开发中经常使用的包之一,其中有三个参数超时的设置经常令人感到困惑,特别是和pythonrequest等其他相比较时,不知道如何对应。参看https。

russle的专栏 9363

socket详解--setSoTimeout()

jdk文档的描述: public void setSoTimeout(int timeout) throws SocketException 使用指定的超时时间启用/禁用SO_TIMEOUT(以毫秒为单位)。 使用此选项设置为非零超时时,与此Socket相关联的InputStream上的read()调用将仅阻止此时间。 如果超时超时,则引发java.net.SocketTimeoutException ,尽管Socket仍然有效。 必须先启用该选项才能进入阻止操作才能生效。 超时时间必须为> 0 。

weixin_43710268的博客 1万+

Socket 关于设置Socket连接超时时间

做网络编程的人对setSoTimeout方法一定很熟悉,都知道是设置连接的超时时间! 但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间!我看了一下JDK 关于这个方法的说明,其实根本不是链路的超时时间!   Java代码   setSoTimeout   public void setSoTimeout(int timeout)       throw

清闲的专栏 7041

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。

morris 7407
上一篇: java面试基础--持续更新
下一篇: 单例模式(Singleton)- 最易懂的设计模式解析
GraceJava
博客等级 码龄10年 131粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值