JAVA之socket编程服务器与客户端通信--实现简易聊天室
生活随笔
收集整理的這篇文章主要介紹了
JAVA之socket编程服务器与客户端通信--实现简易聊天室
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文將介紹TCP和UDP兩種服務(wù)器與客戶端之間的通信協(xié)議
1、首先介紹TCP和UDP分別是什么:TCP(Transfer Control Protocol) 是傳輸控制協(xié)議的縮寫,被稱 TCP / IP。UDP (User Datagram Protocol)是用戶數(shù)據(jù)報(bào)協(xié)議的縮寫,一個(gè)無連接的協(xié)議。
2、本文用到的socket是什么:socket套接字提供了兩臺計(jì)算機(jī)之間的通信機(jī)制。 客戶端程序創(chuàng)建一個(gè)套接字,并嘗試連接服務(wù)器的套接字。
3、本文主要內(nèi)容:
- 服務(wù)器端ServerSocket 對象建立方法:new ServerSocket(2000);端口號為2000
- 服務(wù)器端Socket對象建立方法:ServerSocket對象調(diào)用accept()方法
- 利用Socket對象獲得輸入流:getInputStream()
- 利用輸入流獲得Scanner輸入對象:Scanner(s.getInputStream())
- 客戶端連接服務(wù)器方法:Socket(“127.1.1.1”,2000); 給Socket傳遞兩個(gè)參數(shù)分別是服務(wù)器的IP與端口號
- 利用Socket對象獲得輸出流:getOutputStream()
- 利用輸出流對象進(jìn)行流輸出對象:PrintStream(s.getOutputStream())
一、TCP/IP協(xié)議信息的發(fā)送和接受
1、服務(wù)器一次性向客戶端發(fā)送信息
服務(wù)器service代碼:
import java.net.*; import java.io.*; class service {public static void main(String[] args)throws Exception{ServerSocket ss=new ServerSocket(2000);Socket s=new Socket();while(true){s=ss.accept();PrintStream ps=new PrintStream(s.getOutputStream());ps.println("hello world");}} }客戶端client代碼:
import java.net.*; import java.util.*; class client {public static void main(String[] args)throws Exception{Socket s=new Socket("127.1.1.1",2000);Scanner sc=new Scanner(s.getInputStream());System.out.println(sc.nextLine());} }2、服務(wù)器連續(xù)向客戶端發(fā)送數(shù)據(jù),當(dāng)鍵入quit結(jié)束信息的發(fā)送
服務(wù)器service代碼
import java.net.*; import java.io.*; import java.util.*; class server { Socket s; server(Socket s) throws Exception { this.s=s; PrintStream ps=new PrintStream(s.getOutputStream()); Scanner sc=new Scanner(System.in); while(sc.hasNext()) { String str=sc.nextLine(); if(str.equals("quit"))System.exit(1); ps.println(str); } } public static void main(String[] args) throws Exception { ServerSocket ss=new ServerSocket(2000); while(true) { new server(ss.accept()); } } }客戶端client代碼
import java.net.*; import java.io.*; import java.util.*; class client { client() { try{ Socket s=new Socket("127.1.1.1",2000); Scanner sc=new Scanner(s.getInputStream()); while(sc.hasNext()) { String str=sc.nextLine(); if (str.equals("quit"))System.exit(1); System.out.println(str); } }catch(Exception e){} } public static void main(String[] args) { client sc=new client(); } }3、客戶端連續(xù)向服務(wù)器發(fā)送信息,鍵入quit結(jié)束發(fā)送
服務(wù)器server代碼
import java.net.*; import java.io.*; import java.util.*; class server { server() { try{ ServerSocket ss=new ServerSocket(2000);Socket s=new Socket(); Scanner sc=new Scanner(s.getInputStream()); while(sc.hasNext()) {s=ss.accept(); String str=sc.nextLine(); if(str.equals("quit"))System.exit(1); System.out.println(str); } }catch(Exception e){} } public static void main(String[] args) {server1 sc=new server();} }客戶端client代碼
import java.net.*; import java.io.*; import java.util.*; class client { client() { try{ Socket s=new Socket("127.1.1.1",2000); PrintStream ps=new PrintStream(s.getOutputStream()); Scanner sc=new Scanner(System.in); while(sc.hasNext()) { String str=sc.nextLine(); if (str.equals("quit"))System.exit(1); ps.println(str); } }catch(Exception e){} } public static void main(String[] args) { client sc=new client(); } }4、服務(wù)器端與客戶端各利用兩個(gè)線程分別用于發(fā)送和接收,從而實(shí)現(xiàn)雙向信息接收,鍵入“exit”退出程序。
服務(wù)器service代碼
import java.io.*; import java.util.*; import java.net.*; class servicereceive extends Thread { Socket s; ServerSocket ss; Scanner sc; public void run() { try{ ServerSocket ss=new ServerSocket(2001); Socket s=new Socket(); while(true) { s=ss.accept(); Scanner sc=new Scanner(s.getInputStream()); while(sc.hasNext()) { String str=sc.nextLine(); if (str.equals("exit"))System.exit(1); System.out.println("receive:"+str); } System.exit(1); } }catch(Exception e){} } } class servicesend extends Thread { ServerSocket ss; Socket s; PrintStream ps; Scanner sc; public void run() { try{ ServerSocket ss=new ServerSocket(2000); Socket s=new Socket(); Scanner sc=new Scanner(System.in);while(true) { s=ss.accept(); PrintStream ps=new PrintStream(s.getOutputStream()); while(sc.hasNext()){ String str=sc.nextLine(); if(str.equals("exit"))System.exit(1); ps.println(str); System.out.println("send:"+str); } } }catch(Exception e){}} } class service { public static void main(String[] args) throws Exception { new servicereceive().start(); new servicesend().start(); } }客戶端client代碼
import java.io.*; import java.util.*; import java.net.*; class clientreceive extends Thread { Socket s; Scanner sc; public void run() { try{ Socket s=new Socket("127.1.1.1",2000); Scanner sc=new Scanner(s.getInputStream()); while(sc.hasNext()) { String str=sc.nextLine(); if (str.equals("exit"))System.exit(1); System.out.println("receive:"+str); } }catch(Exception e){}} } class clientsend extends Thread { Socket s; PrintStream ps; Scanner sc; public void run() { try{ Socket s=new Socket("127.1.1.1",2001); PrintStream ps=new PrintStream(s.getOutputStream()); Scanner sc=new Scanner(System.in); while(sc.hasNext()) { String str=sc.nextLine(); if (str.equals("exit"))System.exit(1); ps.println(str); System.out.println("send:"+str); } }catch(Exception e){}} } class client { public static void main(String[] args) throws Exception { new clientreceive().start(); new clientsend().start(); } }5、服務(wù)器向多個(gè)客戶端發(fā)送信息
- 帶線程的類的建立:class multitalk extends Thread
- 多線程對象的建立:multitalk(ss.accept())
- 重寫抽象方法:public void run()
服務(wù)器端代碼
客戶端代碼
import java.util.*; import java.io.*; import java.net.*; class multiclient { multiclient() { try{ Socket s=new Socket("127.1.1.1",2000); Scanner sc=new Scanner(s.getInputStream()); while(sc.hasNext()) { String str=sc.nextLine(); System.out.println(str); if(str.equals("bye"))System.exit(1); } }catch(Exception e){} } public static void main(String[] args) { new multiclient(); } }二、UDP協(xié)議信息的發(fā)送和接收
主要內(nèi)容
- 數(shù)據(jù)報(bào)socket類對象的建立:DatagramSocket(port)
- 數(shù)據(jù)報(bào)對象的建立:DatagramPacket(b,b.length)或DatagramPacket(b,0,b.length,InetAddress.getByName(ip),port)
- 數(shù)據(jù)報(bào)socket類對象接收或發(fā)送數(shù)據(jù)報(bào)對象ds.receive(indp);ds.send(outdp);
- DatagramSocket(port)
1、服務(wù)器接收客戶端信息
服務(wù)端和客戶端公共類udpmessage
import java.net.*; class udpmessage { DatagramPacket indp, outdp; DatagramSocket ds; byte[] b; udpmessage(int port) throws Exception { ds=new DatagramSocket(port); } void sendmessage(String ip,int port) throws Exception { b=new byte[32]; String str="hello from send"; b=str.getBytes(); outdp=new DatagramPacket(b,0,b.length,InetAddress.getByName(ip),port); ds.send(outdp); } void receivemessage() throws Exception { b=new byte[32]; while(true) { indp=new DatagramPacket(b,b.length); ds.receive(indp); System.out.println(new String(b,0,b.length)); } } }發(fā)送端代碼
class sendmessage { public static void main(String[] args) throws Exception { udpmessage send=new udpmessage(4000); send.sendmessage("127.1.1.1",2000); } }接收端代碼
class receivemessage { public static void main(String[] args) throws Exception { udpmessage receive=new udpmessage(2000); receive.receivemessage(); } }2、服務(wù)器端向客戶端組播信息
主要內(nèi)容
- 數(shù)據(jù)報(bào)類:DatagramPacket(b,0,b.length,group,port)
- 組播類: 發(fā)送MulticastSocket() 接收MulticastSocket(port);
- 組播地址:group=InetAddress.getByName(ip);
- 加入組播組:joinGroup(group)
服務(wù)端和客戶端公共類udpmessage
發(fā)送端
class udpcastserver { public static void main(String[] e) throws Exception { new udpcast("224.0.0.0").send(); } }接收端
class udpcastclient { public static void main(String[] e) throws Exception { new udpcast("224.0.0.0").receive(); } }以上就是本文所有內(nèi)容,希望能幫到大家!!!
總結(jié)
以上是生活随笔為你收集整理的JAVA之socket编程服务器与客户端通信--实现简易聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HC05蓝牙串口通信模块
- 下一篇: SWIFT电文类型及格式