Java java지도 시간 Java에서 소켓 프로그래밍 구현 프로세스(코드 예)

Java에서 소켓 프로그래밍 구현 프로세스(코드 예)

Sep 25, 2018 pm 03:07 PM
소켓 프로그래밍

이 기사의 내용은 소켓 프로그래밍의 구현 과정에 관한 것입니다. 특정 참고 가치가 있으므로 도움이 필요한 친구에게 도움이 되기를 바랍니다.

1.socket 서버 구축

소켓 서버를 인스턴스화하고 루프에서 요청을 얻습니다

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();
            }

        }
    }
}
로그인 후 복사

SocketThread 클래스는 다중 스레드 통신을 구현합니다.

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();
			}
		}

	}

}
로그인 후 복사

단일 인스턴스 Chat관리, 모든 클라이언트 스레드를 제어하고 처리합니다

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");
    }
}
로그인 후 복사

이 시점에서, 서버 구축이 완료되었습니다

2. 클라이언트(클라이언트 2개 생성)

클라이언트 1(지정된 서버의 말을 듣고, 콘솔을 통해 메시지를 입력하여 서버와 클라이언트, 클라이언트 간 통신)

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();
		}

	}
}
로그인 후 복사

클라이언트 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();
        }

        
    }
}
로그인 후 복사

GetMess(다른 클라이언트로부터 메시지를 가져와 표시하는 멀티스레드 처리)

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();
            }
            
        }
        
    }

    
    
    
}
로그인 후 복사

좋아요, 간단한 sockte 서비스와 클라이언트가 완성되었습니다

서버를 먼저 시작하고

클라이언트를 별도로 시작하세요

현재 세션을 닫으려면 종료를 입력하세요

위 내용은 Java에서 소켓 프로그래밍 구현 프로세스(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

데이터 통신을 위해 Python에서 소켓 프로그래밍을 사용하는 방법 데이터 통신을 위해 Python에서 소켓 프로그래밍을 사용하는 방법 Oct 18, 2023 am 11:06 AM

제목: Python의 소켓 프로그래밍 및 코드 예제 소개: 현대 인터넷 시대에는 데이터 통신이 어디에나 있습니다. Python의 소켓 프로그래밍은 네트워크에서 데이터 전송을 실현하는 간단하고 효과적인 방법을 제공합니다. 이 기사에서는 데이터 통신을 위해 Python의 소켓 모듈을 사용하는 방법을 소개하고 독자가 소켓 프로그래밍을 더 잘 이해하고 적용할 수 있도록 구체적인 코드 예제를 제공합니다. 1. 소켓 프로그래밍이란 무엇입니까? 소켓, 즉 소켓은 다음을 구현한 것입니다.

PHP의 소켓 프로그래밍 기능을 사용하는 방법은 무엇입니까? PHP의 소켓 프로그래밍 기능을 사용하는 방법은 무엇입니까? Jun 03, 2023 pm 09:51 PM

PHP는 웹 개발에 널리 사용되는 프로그래밍 언어이며 많은 네트워크 프로그래밍 응용 프로그램을 지원합니다. 그 중 소켓 프로그래밍은 네트워크 통신을 구현하는 데 일반적으로 사용되는 방법으로, 프로그램이 프로세스 간 통신을 구현하고 네트워크를 통해 데이터를 전송할 수 있도록 합니다. 이 기사에서는 PHP에서 소켓 프로그래밍 기능을 사용하는 방법을 소개합니다. 1. 소켓 프로그래밍 소개 소켓(socket)은 네트워크 통신에서 열린 포트를 나타내는 추상적인 개념이다. 프로세스가 다른 프로세스와 통신하기 위해서는 이 포트에 연결되어야 한다.

네트워크 프로그래밍에 C++를 사용하는 방법은 무엇입니까? 네트워크 프로그래밍에 C++를 사용하는 방법은 무엇입니까? Nov 03, 2023 am 11:10 AM

인터넷이 발전하면서 네트워크 프로그래밍은 점점 더 컴퓨터 과학의 중요한 부분이 되었습니다. 강력한 프로그래밍 언어인 C++는 네트워크 프로그래밍에 대한 많은 지원도 제공합니다. 이 기사에서는 네트워크 프로그래밍에 C++를 사용하는 방법을 소개합니다. 네트워크 프로그래밍 개요 네트워크 프로그래밍은 컴퓨터 네트워크를 사용하여 통신하기 위한 프로그램을 작성하는 프로세스입니다. 네트워크 프로그래밍에서는 데이터 전송을 위해 네트워크 프로토콜(예: TCP/IP)을 사용해야 합니다. 네트워크 프로그래밍에는 클라이언트와 서버라는 두 가지 주요 역할이 있습니다. 클라이언트는 요청을 시작하는 프로그램을 참조하며,

Go 언어로 소켓 프로그래밍 및 서버측 작성 Go 언어로 소켓 프로그래밍 및 서버측 작성 May 31, 2023 pm 11:40 PM

인터넷의 급속한 발전으로 인해 네트워크 통신이 필요한 응용 프로그램이 많아지고 소켓 프로그래밍이 중요한 프로그래밍 방법이 되었습니다. Go 언어는 최근 많은 주목을 받고 있는 프로그래밍 언어로, 네트워크 프로그래밍 분야에서도 독특한 장점을 갖고 있습니다. 이 기사에서는 Go 언어로 소켓 프로그래밍을 소개하고 간단한 서버 프로그램을 작성하는 방법을 소개합니다. 1. 소켓 프로그래밍 개요 소켓은 애플리케이션 계층과 전송 계층 사이에 제공되는 추상화 계층으로, 애플리케이션이 네트워크를 통해 통신할 수 있도록 해줍니다.

PHP 초보자 가이드: 소켓 프로그래밍 PHP 초보자 가이드: 소켓 프로그래밍 May 21, 2023 am 08:31 AM

PHP 시작 가이드: 소켓 프로그래밍 소켓 프로그래밍은 컴퓨터 네트워크에서 통신하는 방법을 의미합니다. 소켓 프로그래밍을 통해 채팅방, 온라인 게임, 인터넷 통화 등과 같은 다양한 유형의 네트워크 응용 프로그램을 구현할 수 있습니다. 웹 개발 분야에서 소켓 프로그래밍은 실시간 통신, 푸시 메시지 및 기타 기능을 구현하는 등 매우 중요한 역할을 합니다. 이러한 방식으로 웹 애플리케이션을 더욱 다채롭고 대화형으로 만들 수 있습니다. PHP는 매우

PHP8.0의 소켓 프로그래밍 PHP8.0의 소켓 프로그래밍 May 14, 2023 am 08:27 AM

소프트웨어의 발전과 인터넷의 대중화로 인해 네트워크 프로그래밍이 점점 더 중요해지고 있으며, 소켓 프로그래밍은 네트워크 프로그래밍을 구현하기 위한 가장 기본적이고 낮은 수준의 기능 중 하나입니다. PHP8.0이 출시되면서 PHP에 몇 가지 새로운 기능과 최적화가 도입되었음을 확인할 수 있습니다. 이 기사에서는 PHP8.0에서 소켓 프로그래밍을 구현하는 방법을 살펴보겠습니다. 소켓 프로그래밍이란 무엇입니까? 소켓은 클라이언트와 서버 간의 연결을 설정할 수 있는 네트워크 통신을 위한 프로그래밍 방법입니다. 웹 개발에서 가장 일반적인

Go 언어로 소켓 프로그래밍에 대한 자세한 설명 Go 언어로 소켓 프로그래밍에 대한 자세한 설명 Jun 01, 2023 am 08:07 AM

최근 몇 년 동안 Go 언어(Golang이라고도 함)가 프로그래머 커뮤니티에서 점점 인기를 얻고 있습니다. Go 언어는 배우기 쉽고 효율적이며 강력하고 안전하며 안정적이어서 개발자들에게 깊은 사랑을 받고 있습니다. 그중 Go 언어의 소켓 프로그래밍 지원은 광범위한 관심과 찬사를 받았습니다. 이 기사에서는 Go 언어의 소켓 프로그래밍에 대해 자세히 소개하고 기본 원칙, 사용법, 코드 구현 및 기타 관련 내용을 다룹니다. 1. 소켓 프로그래밍의 기본 원리 소켓 프로그래밍은 네트워크 프로그래밍에서 소켓을 사용하는 것을 의미합니다.

Java에서 발생하는 코드 네트워크 프로그래밍 문제를 해결하는 방법 Java에서 발생하는 코드 네트워크 프로그래밍 문제를 해결하는 방법 Jun 30, 2023 pm 04:28 PM

Java에서 발생하는 코드 네트워크 프로그래밍 문제를 해결하는 방법 소개: 인터넷의 급속한 발전으로 인해 네트워크 프로그래밍은 개발자에게 없어서는 안 될 기술 중 하나가 되었습니다. 널리 사용되는 프로그래밍 언어인 Java는 네트워크 프로그래밍에서도 고유한 장점과 과제를 갖고 있습니다. 이 기사에서는 Java의 일반적인 네트워크 프로그래밍 문제를 살펴보고 솔루션을 제공합니다. 1. 소켓 연결 문제 소켓은 네트워크 통신의 기본 구성 요소 중 하나이지만 소켓을 사용하여 연결할 때 다음과 같은 문제가 발생할 수 있습니다.

See all articles