Java中socket编程的实现过程(代码实例)
本篇文章给大家带来的内容是关于socket编程的实现过程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1.socket 服务器搭建
实例化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(); } } } }
单例Chatmanage,对所有客户端线程管控处理
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.客户端(创建两个客户端)
客户端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(); } } } }
ok,简单的sockte服务与客户端完成了
先启动server
在分别启动client
输入结束bye,关闭当前会话
Atas ialah kandungan terperinci Java中socket编程的实现过程(代码实例). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tajuk: Pengaturcaraan Soket dan Contoh Kod dalam Python Pengenalan: Dalam era Internet moden, komunikasi data ada di mana-mana. Pengaturcaraan soket dalam Python menyediakan cara yang mudah dan berkesan untuk merealisasikan penghantaran data pada rangkaian. Artikel ini akan memperkenalkan cara menggunakan modul soket Python untuk komunikasi data, dan menyediakan contoh kod khusus untuk membantu pembaca memahami dan menggunakan pengaturcaraan soket dengan lebih baik. 1. Apakah pengaturcaraan soket? Soket, iaitu, soket, adalah pelaksanaan

PHP ialah bahasa pengaturcaraan yang digunakan secara meluas dalam pembangunan web dan menyokong banyak aplikasi pengaturcaraan rangkaian. Antaranya, pengaturcaraan Socket ialah cara yang biasa digunakan untuk melaksanakan komunikasi rangkaian Ia membolehkan program melaksanakan komunikasi antara proses dan menghantar data melalui rangkaian. Artikel ini akan memperkenalkan cara menggunakan fungsi pengaturcaraan Socket dalam PHP. 1. Pengenalan kepada Socket Programming Socket (soket) ialah konsep abstrak yang mewakili port terbuka dalam komunikasi rangkaian Sesuatu proses perlu disambungkan ke port ini untuk berkomunikasi dengan proses lain.

Dengan perkembangan Internet, pengaturcaraan rangkaian semakin menjadi bahagian penting dalam sains komputer. Sebagai bahasa pengaturcaraan yang berkuasa, C++ juga menyediakan banyak sokongan untuk pengaturcaraan rangkaian. Artikel ini akan memperkenalkan cara menggunakan C++ untuk pengaturcaraan rangkaian. Gambaran Keseluruhan Pengaturcaraan Rangkaian Pengaturcaraan rangkaian ialah proses menulis atur cara untuk komunikasi menggunakan rangkaian komputer. Pengaturcaraan rangkaian memerlukan penggunaan protokol rangkaian (seperti TCP/IP) untuk penghantaran data. Dalam pengaturcaraan rangkaian, terdapat dua peranan utama: klien dan pelayan. Pelanggan merujuk kepada program yang memulakan permintaan, dan

Dengan perkembangan pesat Internet, lebih banyak aplikasi memerlukan komunikasi rangkaian, dan pengaturcaraan soket telah menjadi kaedah pengaturcaraan yang penting. Bahasa Go ialah bahasa pengaturcaraan yang telah menarik banyak perhatian sejak beberapa tahun kebelakangan ini, dan ia juga mempunyai kelebihan unik dalam bidang pengaturcaraan rangkaian. Artikel ini akan memperkenalkan pengaturcaraan soket dalam bahasa Go dan cara menulis program pelayan mudah. 1. Gambaran keseluruhan pengaturcaraan soket Soket ialah lapisan abstraksi yang disediakan antara lapisan aplikasi dan lapisan pengangkutan, yang membolehkan aplikasi berkomunikasi melalui rangkaian.

Panduan Permulaan PHP: Pengaturcaraan Soket Pengaturcaraan soket merujuk kepada cara berkomunikasi pada rangkaian komputer Melalui pengaturcaraan Socket, kita boleh melaksanakan pelbagai jenis aplikasi rangkaian, seperti bilik sembang, permainan dalam talian, panggilan Internet, dll. Dalam bidang pembangunan Web, pengaturcaraan Socket juga memainkan peranan yang sangat penting, seperti merealisasikan komunikasi masa nyata, mesej push dan fungsi lain Dengan cara ini, kita boleh menjadikan aplikasi Web lebih berwarna dan interaktif. PHP adalah sangat

Dengan pembangunan perisian dan populariti Internet, pengaturcaraan rangkaian menjadi semakin penting, dan pengaturcaraan Socket adalah salah satu fungsi paling asas dan peringkat rendah untuk merealisasikan pengaturcaraan rangkaian. Dengan keluaran PHP8.0, kita dapat melihat bahawa PHP telah memperkenalkan beberapa ciri dan pengoptimuman baharu. Dalam artikel ini, kami akan meneroka cara melaksanakan pengaturcaraan Socket dalam PHP8.0. Apakah pengaturcaraan Socket? Soket ialah kaedah pengaturcaraan untuk komunikasi rangkaian yang boleh mewujudkan sambungan antara klien dan pelayan. Yang paling biasa dalam pembangunan web

Dalam beberapa tahun kebelakangan ini, bahasa Go (juga dikenali sebagai Golang) telah menjadi semakin popular di kalangan komuniti pengaturcara. Bahasa Go mudah dipelajari, cekap, berkuasa, selamat dan stabil, jadi ia amat disukai oleh pembangun. Antaranya, sokongan bahasa Go untuk pengaturcaraan Socket telah mendapat perhatian dan pujian yang meluas. Artikel ini akan memperkenalkan pengaturcaraan Socket dalam bahasa Go secara terperinci, meliputi prinsip asas, penggunaan, pelaksanaan kod dan kandungan lain yang berkaitan. 1. Prinsip asas pengaturcaraan Soket Pengaturcaraan soket merujuk kepada penggunaan Socket dalam pengaturcaraan rangkaian

Bagaimana untuk menyelesaikan masalah pengaturcaraan rangkaian kod yang dihadapi dalam Java Pengenalan: Dengan perkembangan pesat Internet, pengaturcaraan rangkaian telah menjadi salah satu kemahiran yang sangat diperlukan untuk pembangun. Sebagai bahasa pengaturcaraan yang digunakan secara meluas, Java juga mempunyai kelebihan dan cabaran uniknya dalam pengaturcaraan rangkaian. Artikel ini akan meneroka masalah pengaturcaraan rangkaian biasa di Java dan menyediakan penyelesaian. 1. Masalah sambungan soket Soket ialah salah satu komponen asas untuk komunikasi rangkaian, tetapi apabila menggunakan Soket untuk menyambung, anda mungkin menghadapi masalah berikut:
