1. 程式人生 > >java使用多執行緒實現多客戶端的通訊

java使用多執行緒實現多客戶端的通訊

實現步驟:

伺服器端:

1、建立ServerSocket物件,繫結監聽埠

2、通過accept()方法監聽客戶端請求(迴圈監聽)

3、server與socket建立專線連線,兩個socket在一個單獨的執行緒上對話、通過輸入流讀取客戶端傳送的請求資訊

4、通過輸出流向客戶端傳送響應資訊

5、server繼續等待新的連線

6、關閉相應資源

客戶端:

1、建立Socket物件,指明需要連線的伺服器的地址和埠號

2、連線建立後,通過輸出流向伺服器端傳送請求資訊

3、通過輸入流獲取伺服器響應的資訊

4、關閉相應的資源

Server

package com.socket;

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

import javax.swing.text.AbstractDocument.BranchElement;

/*
 * 基於TCP協議的Socket通訊,實現使用者登入
 * 伺服器端
 */
public class Server {
	public static void main(String[] args) {
		try {
			
			//1.建立一個伺服器端的Socket,即ServerSocket,指定繫結的埠,並監聽此埠
			ServerSocket serverSocket=new ServerSocket(8888);
			//2.呼叫accept方法開始監聽,等待客戶端的連線
			Socket socket=null;
			int count=0;
			System.out.println("***伺服器即將啟動,等待客戶端的連線***");
			while(true) {
				socket=serverSocket.accept();
				ServerThread serverThread = new ServerThread(socket);
				serverThread.start();
				//統計客戶端的數量
				count++;
				System.out.println("客戶端的數量為:"+count);
				InetAddress address = socket.getInetAddress();
				System.out.println("客戶端的ip為:"+address.getHostAddress());
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Client

package com.socket;

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

/*
 * 客戶端
 */
public class Client {
	public static void main(String[] args) {
		try {
			//1.建立客戶端socket,指定伺服器地址和埠
			Socket socket=new Socket("localhost", 8888);
			//2.獲取輸出流,向伺服器端傳送訊息
			OutputStream os=socket.getOutputStream(); //位元組輸出流
			PrintWriter pw=new PrintWriter(os);		//將位元組流包裝成列印流
			pw.write("使用者名稱:xiaolu;密碼:233");
			pw.flush(); //重新整理快取
			socket.shutdownOutput();
			//3.獲取輸入流,並讀取伺服器端的響應資訊
			InputStream is=socket.getInputStream();
			BufferedReader br=new BufferedReader(new InputStreamReader(is));
			String info=null;
			while((info=br.readLine())!=null) {
				System.out.println("我是客戶端,伺服器說:"+info);
			}
			br.close();
			is.close();
			pw.close();
			os.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {              
			e.printStackTrace();
		}
		
	}
}

ServerThread

package com.socket;

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

/*
 * 伺服器執行緒處理類
 */

public class ServerThread extends Thread{
	//和本執行緒相關的Socket
	Socket socket = null;
	
	public ServerThread(Socket socket) {
		this.socket=socket;
	}
	//執行緒執行操作,響應客戶端請求
	public void run() {
		
		InputStream is = null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		OutputStream os = null;
		PrintWriter pw = null;
		try {
			//3. 獲取輸入流,並讀取客戶端資訊
			is = socket.getInputStream();
			isr = new InputStreamReader(is);
			br = new BufferedReader(isr);
			String info=null;
			while((info=br.readLine())!=null) {
				System.out.println("我是伺服器,客戶端說:"+info);
			}
			socket.shutdownInput();//關閉輸入流
			
			os = socket.getOutputStream();
			pw = new PrintWriter(os);
			pw.write("歡迎你!");
			pw.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(pw!=null)
					pw.close();
				if(os!=null)
					os.close();
				//關閉資源
				if(br!=null)
					br.close();
				if(isr!=null)
					isr.close();
				if(is!=null)
					is.close();
				if(socket!=null)
					socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}

相關推薦

Java Socket應用(三)執行實現客戶通訊

伺服器執行緒處理類ServerThread.java : package com.yijia; import java.io.*; import java.net.Socket; /** * 建立時間:2018/10/4 14:59 * 作者: * 郵箱:[ema

java使用執行實現客戶通訊

實現步驟:伺服器端:1、建立ServerSocket物件,繫結監聽埠2、通過accept()方法監聽客戶端請求(迴圈監聽)3、server與socket建立專線連線,兩個socket在一個單獨的執行緒上對話、通過輸入流讀取客戶端傳送的請求資訊4、通過輸出流向客戶端傳送響應資訊

Java Socket(六) 使用執行實現客戶通訊

問題 一個服務端可以跟多個客戶端通訊 基本步驟 1.伺服器端建立ServerSocket方法,迴圈呼叫accept()方法等待客戶端連線 2.客戶端建立socket和服務的請求連線 3.服務端接受客戶端的請求,建立專線連線 4.建立連線的兩個sock

Socket 服務使用執行實現客戶通訊例項

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; impo

socket使用執行實現客戶通訊

伺服器端:package com.imooc;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/* * 基於TCP協議的Socket通訊,實現使用者登入 * 伺服器端

執行使用ZK客戶可能會出現的問題。java.io.IOException: 遠端主機強迫關閉了一個現有的連線。

java.io.IOException: 遠端主機強迫關閉了一個現有的連線。 at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(So

Qt 執行伺服器與客戶

文章目錄 思路 伺服器 myserver.h myserver.cpp mythread.h mythread.cpp mysocket.h mysocket.cpp

java使用 網路連線+RandomAccessFile + io 執行實現執行下載檔案並顯示實時網速

下載檔案的時候,一個大檔案切成很多片,用多執行緒下載,速度會快很多 閱讀程式碼的時候注意檢視程式碼裡面的註釋 想用多執行緒下載檔案,則, 第一:得了解  RandomAccessFile  類,這是個隨機訪問檔案類,裡面可以設定 訪問的 開始地址和結束地址,且該類可讀可

linux tcp執行伺服器與客戶程式設計例項

伺服器端: #include<iostream> #include<arpa/inet.h> #include<sys/socket.h> #include<cstdlib> #include<cstdio> #i

執行實現使用者同時收發的簡單socket服務

簡單的socket程式碼和多執行緒練習用socket服務端和多執行緒實現可以連線多個客戶端並同時收發的功能。這裡要用到socket 和 threading所以,記得:import socket, threading一、建立socket服務端首先,按正常操作,建立一個socke

Java 執行實現個視窗同時賣票

建立執行緒的第二種方式:實現Runable介面 步驟: 1,定義類實現Runnable介面 2,覆蓋Runnable介面中的run方法。將執行緒要執行的程式碼存放在該run方法中。 3,通過Thread類建立執行緒物件。 4,將Runnable介面的子類物件作為實際引數傳遞

基於Python執行的TCP客戶/服務應用示例

每個連線都必須建立新執行緒(或程序)來處理,否則,單執行緒在處理連線的過程中,無法接受其他客戶端的連線。 服務端:server.py # -*- coding:utf-8 -*- import s

二、執行實現簡單的socket通訊例項(TCP)

1.伺服器端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @createTime:2018/

Linux系統程式設計——執行實現

概述 每個程序都擁有自己的資料段、程式碼段和堆疊段,這就造成程序在進行建立、切換、撤銷操作時,需要較大的系統開銷。為了減少系統開銷,從程序中演化出了執行緒。為了讓程序完成一定的工作,程序必須至少包含一個執行緒。執行緒存在於程序中,共享程序的資源。更多詳情,請看《程序和執行緒的區別與聯絡》

執行執行實現工)

多工 多工指在作業系統中可以同時執行多個任務,現在的大多數系統都是多工的 作用:能夠充分合理的運用系統的資源,讓其作用發揮到最大 實現多工有哪些方式呢? 1.多執行緒 2.多程序 3.多協程 今天主要說說多執行緒實現多工 首先了解了解並行與併

通過執行實現非阻塞TCP通訊

在tcp通訊中,一般都是阻塞的,如果要實現非阻塞,我們可以使用多執行緒也可以使用nio中相關的類。這裡我使用的是多執行緒的方式實現非阻塞。 伺服器端: 1.建立ServerSocket物件,繫結監聽埠; 2.呼叫accept()方法對客戶端進行監聽; 3

Java使用執行實現Socket客戶通訊

 要想詳細瞭解socket,大家請自行百度,我這裡只簡單介紹。   在網路中,我們可以利用ip地址+協議+埠號唯一標示網路中的一個程序。而socket程式設計就是為了完成兩個唯一程序之間的通訊(一個是客戶端,一個是伺服器端),其中用到的協議是TCP/UDP協議,它們都屬於傳輸層的協議。   TCP是基於連

JavaJava執行實現的聊天客戶和伺服器

主要涉及知識 ·Java中GUI程式的編寫,包括事件監聽機制。 ·Java的網路通訊程式設計,ServerSocket,Socket類的使用。 ·Java中多執行緒的程式設計,Thread類,Runnable介面的使用。 原始碼 客戶端 package project1

應用java執行實現伺服器客戶之間的通訊

package test.concurrent.socket; import java.io.*; import java.net.Socket; /** * Created by dong on 15-6-22. * 伺服器端執行緒處理類 */ public class ServerThread

java網路程式設計(二)複用Socket連線以及使用執行完成客戶的連線

在前面的示例中,客戶端中建立了一次連線,只發送一次資料就關閉了,這就相當於撥打電話時,電話打通了只對話一次就關閉了,其實更加常用的應該是撥通一次電話以後多次對話,這就是複用客戶端連線。 那 麼如何實現建立一次連線,進行多次資料交換呢?其實很簡單,建立連線以後,