Maison Java javaDidacticiel Processus d'implémentation de la programmation socket en Java (exemple de code)

Processus d'implémentation de la programmation socket en Java (exemple de code)

Sep 25, 2018 pm 03:07 PM
socket编程

Le contenu de cet article concerne le processus de mise en œuvre de la programmation socket. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1.Construction du serveur socket

Instancier le serveur socket et obtenir les requêtes en boucle

package com.orange.util;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
 * socket服务器
 * 
 * @author Chengjq
 *
 */
public class SocketServer {
    public static int count = 0;
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        int port = 4404;
        // 首先直接创建serversocket
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("启动socketServer成功,等待客户端的连接");
            while (true) {
                socket = serverSocket.accept();
                System.out.println("有新的客户端请求连接");
                SocketThread st = new SocketThread(socket);
                st.start();
                ChatManager.getChatManager().add(st);
                //启动定时任务,如果10s内没有进程
                /*Runnable runnable = new Runnable() {
                    int clientNum = 0;
                    public void run() {  
                        // task to run goes here  
                        clientNum = ChatManager.getChatManager().vector.size();
                        System.out.println("剩余客户端数量:"+clientNum);
                        if(clientNum ==0 ){
                            System.out.println("连接超时,或者无客户端连接,关闭serverSocket");
                            //关闭socket
                            //.....
                        }
                    }  
                };  
                ScheduledExecutorService service = Executors  
                        .newSingleThreadScheduledExecutor();  
                // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间  
                service.scheduleAtFixedRate(runnable, 2, 10, TimeUnit.SECONDS);  */
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            System.out.println("serverSocket已超时");
            try {
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}
Copier après la connexion

La classe SocketThread implémente la communication multithread

package com.orange.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * SocketThread实现多线程通信
 * 
 * @author Administrator
 *
 */
public class SocketThread extends Thread {
	ServerSocket serverSocket = null;
	Socket socket = null;
	public SocketThread(ServerSocket serverSocket,Socket socket) {
		super();
		this.serverSocket = serverSocket;
		this.socket = socket;
	}
	public SocketThread(Socket socket) {
		super();
		this.socket = socket;
	}
	public void out(String out) {
        try {
            socket.getOutputStream().write(out.getBytes("utf-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
	public void publish(String out){
		ChatManager.getChatManager().publish(this, out);
	}
	

	@Override
	public void run() {
		// TODO Auto-generated method stub
		BufferedReader socketIn = null;
		PrintWriter socketOut = null;
		String inMess = null;
		try {
			socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			socketOut = new PrintWriter(socket.getOutputStream());
			while (true) {
				inMess = socketIn.readLine();
				publish(inMess);
				if("bye".equals(inMess)){
					ChatManager.getChatManager().remove(this);
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				System.out.println("已结束当前会话");
				socketOut.close();
				socketIn.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}
Copier après la connexion

Prenez Chatmanage comme exemple, gérez et contrôlez tous les threads clients

package com.orange.util;
import java.util.Vector;
public class ChatManager {
    // 实现单例化
    private ChatManager() {
    };
    private static final ChatManager cm = new ChatManager();
    public static ChatManager getChatManager() {// 返回值为ChatManager
        return cm;
    }
    // 单例化完成
    Vector<SocketThread> vector = new Vector<SocketThread>();

    public void add(SocketThread st) {// 为当前集合添加SocketThread对象
        vector.add(st);
    }
    
    public void remove(SocketThread st) {// 当前客户端关闭连接
        vector.remove(st);
    }
    
    public void removeall() {// 关闭所有连接
        for (int i = 0; i < vector.size(); i++) {// 遍历所有的线程
            SocketThread csChatSocket = vector.get(i);
            if(csChatSocket!=null){
                vector.remove(csChatSocket);
            }
                
        }
    }

    // 某一个线程向其他的客户端发送信息
    public void publish(SocketThread st, String out) {
        for (int i = 0; i < vector.size(); i++) {// 遍历所有的线程
            SocketThread csChatSocket = vector.get(i);
            if (csChatSocket != st)// 判断不是当前线程就发送此消息
                csChatSocket.out(out + "\n");
        }
    }

    // 向当前线程发信息
    public void publish_present(SocketThread st, String out) {
        st.out(out + "\n");
    }
}
Copier après la connexion

À ce stade, le serveur est configuré

Client (créez deux clients)<🎜. >

Client 1 (Écoutez le serveur spécifié et saisissez des messages via la console pour communiquer entre le serveur et le client et entre les clients,)

package com.orange;

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

/**
 * 客户端1
 * @author Chengjq
 *
 */
public class SocketClient1 {

	@SuppressWarnings("static-access")
	public static void main(String[] args) {
		try {
			//初始化客户端
			Socket socket = new Socket("127.0.0.1", 4404);
			BufferedReader readline = new BufferedReader(new InputStreamReader(System.in));
			//获取输出打印流
			PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
			String outTemp = null;
			System.out.println("开始准备向服务器端发起请求---\n自己:");
			// 已启动连接socket服务器,准备实时接收来自其他客户端的消息
			GetMess getMess = new GetMess(socket);
			getMess.start();
			// 通过控制台发送消息给其他客户端,以“bye”为结束语
			while ((outTemp = readline.readLine()) != null) {
				//发送信息
				socketOut.println(outTemp);
				socketOut.flush();
				if("bye".equals(outTemp)){
					break;
				}
			}
			getMess.currentThread().interrupt();
			//依次关闭各种流
			readline.close();
			socketOut.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
Copier après la connexion
Client 2

package com.orange;

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

public class SocketClient2 {
    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        
        try {
            //初始化客户端
            Socket socket = new Socket("127.0.0.1", 4404);
            BufferedReader readline = new BufferedReader(new InputStreamReader(System.in));
            //获取输出打印流
            PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
            String outTemp = null;
            System.out.println("开始准备向服务器端发起请求---\n自己:");
            // 已启动连接socket服务器,准备实时接收来自其他客户端的消息
            GetMess getMess = new GetMess(socket);
            getMess.start();
            // 通过控制台发送消息给其他客户端,以“bye”为结束语
            while ((outTemp = readline.readLine()) != null) {
                //发送信息
                socketOut.println(outTemp);
                socketOut.flush();
                if("bye".equals(outTemp)){
                    break;
                }
            }
            getMess.currentThread().interrupt();
            //依次关闭各种流
            readline.close();
            socketOut.close();
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        
    }
}
Copier après la connexion
GetMess (traitement multithread Récupérez les messages d'autres clients et affichez-les)

package com.orange;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class GetMess extends Thread {

    Socket socket = null;
    
    public GetMess(Socket socket) {
        super();
        this.socket = socket;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        BufferedReader socketIn = null;
        try {
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            socketIn = new BufferedReader(isr);
            String inTemp = null;
            while(true){
                inTemp = socketIn.readLine();
                if(inTemp != null && !"bye".equals(inTemp) ){
                    System.out.println("好友:\n"+inTemp);
                }else{
                    System.out.println("好友:\n已下线,关闭当前回话");
                    break;
                } 
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                Thread.currentThread().interrupt();
                socketIn.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
    }

    
    
    
}
Copier après la connexion
ok, le service sockte simple et le client sont terminés

Démarrez d'abord le serveur

puis démarrez le client séparément

Entrez bye pour clôturer la session en cours

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la programmation socket en Python pour la communication de données Comment utiliser la programmation socket en Python pour la communication de données Oct 18, 2023 am 11:06 AM

Titre : Programmation de sockets et exemples de code en Python Introduction : À l'ère d'Internet moderne, la communication de données est partout. La programmation socket en Python offre un moyen simple et efficace de réaliser la transmission de données sur le réseau. Cet article explique comment utiliser le module socket de Python pour la communication de données et fournit des exemples de code spécifiques pour aider les lecteurs à mieux comprendre et appliquer la programmation socket. 1. Qu'est-ce que la programmation de sockets ? Socket, c'est-à-dire socket, est l'implémentation de

Comment utiliser la fonction de programmation socket de PHP ? Comment utiliser la fonction de programmation socket de PHP ? Jun 03, 2023 pm 09:51 PM

PHP est un langage de programmation largement utilisé dans le développement Web et prend en charge de nombreuses applications de programmation réseau. Parmi eux, la programmation Socket est un moyen couramment utilisé pour mettre en œuvre la communication réseau. Elle permet aux programmes de mettre en œuvre une communication inter-processus et de transmettre des données via le réseau. Cet article explique comment utiliser les fonctions de programmation Socket en PHP. 1. Introduction à la programmation Socket Socket (socket) est un concept abstrait qui représente un port ouvert dans la communication réseau. Un processus doit se connecter à ce port afin de communiquer avec d'autres processus.

Comment utiliser le C++ pour la programmation réseau ? Comment utiliser le C++ pour la programmation réseau ? Nov 03, 2023 am 11:10 AM

Avec le développement d’Internet, la programmation réseau est devenue une partie importante de l’informatique. En tant que langage de programmation puissant, C++ offre également une grande prise en charge de la programmation réseau. Cet article explique comment utiliser le C++ pour la programmation réseau. Présentation de la programmation réseau La programmation réseau est le processus d'écriture de programmes de communication utilisant des réseaux informatiques. La programmation réseau nécessite l'utilisation de protocoles réseau (tels que TCP/IP) pour la transmission des données. En programmation réseau, il existe deux rôles principaux : client et serveur. Le client fait référence au programme qui initie la demande, et

Programmation socket et écriture côté serveur en langage Go Programmation socket et écriture côté serveur en langage Go May 31, 2023 pm 11:40 PM

Avec le développement rapide d'Internet, de plus en plus d'applications nécessitent une communication réseau et la programmation par socket est devenue une méthode de programmation importante. Le langage Go est un langage de programmation qui a beaucoup attiré l'attention ces dernières années et qui présente également des avantages uniques dans le domaine de la programmation réseau. Cet article présentera la programmation socket en langage Go et comment écrire un programme serveur simple. 1. Présentation de la programmation socket Socket est une couche d'abstraction située entre la couche application et la couche transport, qui permet aux applications de communiquer sur le réseau.

Guide du débutant en PHP : programmation Socket Guide du débutant en PHP : programmation Socket May 21, 2023 am 08:31 AM

Guide de démarrage PHP : programmation Socket La programmation Socket fait référence à un moyen de communiquer sur un réseau informatique. Grâce à la programmation Socket, nous pouvons implémenter de nombreux types d'applications réseau, telles que des salons de discussion, des jeux en ligne, des appels Internet, etc. Dans le domaine du développement Web, la programmation Socket joue également un rôle très important, comme la réalisation de communications en temps réel, de messages push et d'autres fonctions, de cette manière, nous pouvons rendre les applications Web plus colorées et interactives. PHP est un très

Programmation de sockets en PHP8.0 Programmation de sockets en PHP8.0 May 14, 2023 am 08:27 AM

Avec le développement des logiciels et la popularité d'Internet, la programmation réseau devient de plus en plus importante, et la programmation Socket est l'une des fonctions les plus basiques et de bas niveau pour réaliser la programmation réseau. Avec la sortie de PHP8.0, nous pouvons constater que PHP a introduit de nouvelles fonctionnalités et optimisations. Dans cet article, nous explorerons comment implémenter la programmation Socket dans PHP8.0. Qu’est-ce que la programmation Socket ? Socket est une méthode de programmation pour la communication réseau qui peut établir une connexion entre un client et un serveur. Le plus courant dans le développement Web

Explication détaillée de la programmation Socket en langage Go Explication détaillée de la programmation Socket en langage Go Jun 01, 2023 am 08:07 AM

Ces dernières années, le langage Go (également connu sous le nom de Golang) est devenu de plus en plus populaire parmi la communauté des programmeurs. Le langage Go est facile à apprendre, efficace, puissant, sûr et stable, il est donc profondément apprécié des développeurs. Parmi eux, la prise en charge du langage Go pour la programmation Socket a reçu une large attention et des éloges. Cet article présentera en détail la programmation Socket en langage Go, couvrant les principes de base, l'utilisation, l'implémentation du code et d'autres contenus connexes. 1. Principes de base de la programmation Socket La programmation Socket fait référence à l'utilisation de Socket dans la programmation réseau.

Comment résoudre les problèmes de programmation réseau de code rencontrés en Java Comment résoudre les problèmes de programmation réseau de code rencontrés en Java Jun 30, 2023 pm 04:28 PM

Comment résoudre les problèmes de programmation réseau de code rencontrés en Java Introduction : Avec le développement rapide d'Internet, la programmation réseau est devenue l'une des compétences indispensables aux développeurs. En tant que langage de programmation largement utilisé, Java présente également des avantages et des défis uniques en matière de programmation réseau. Cet article explorera les problèmes courants de programmation réseau en Java et proposera des solutions. 1. Problèmes de connexion Socket Socket est l'un des composants de base de la communication réseau, mais lorsque vous utilisez Socket pour vous connecter, vous pouvez rencontrer les problèmes suivants :

See all articles