一篇文章帶你入門java網(wǎng)絡(luò)編程
基于TCP/IP協(xié)議的通信
- TCP/IP協(xié)議
- TCP/IP協(xié)議.會(huì)在通信兩端建立連接(虛擬連接),用于發(fā)送和接收數(shù)據(jù)
- TCP/IP協(xié)議是一種可靠的網(wǎng)絡(luò)協(xié)議,它通過(guò)重發(fā)機(jī)制來(lái)保證這種可靠性
通信的實(shí)現(xiàn)
ServerSocket用來(lái)監(jiān)聽來(lái)自客戶端的連接,當(dāng)沒有連接時(shí),它處于阻塞狀態(tài)
客戶端使用Socket連接到指定的服務(wù)器
基于UDP協(xié)議的通信
- UDP協(xié)議
- UDP協(xié)議不會(huì)在通信兩端建立連接(虛擬鏈路),而是直接發(fā)送連接
- UDP協(xié)議是一種不可靠的網(wǎng)絡(luò)協(xié)議,但是這種協(xié)議的通信效率非常高
- 通信的實(shí)現(xiàn)
- DatagramSocket用于兩端的通信,它不負(fù)責(zé) 維護(hù)狀態(tài),不產(chǎn)生io流,僅僅是發(fā)送或接受數(shù)據(jù)包
- DatagramPacket代表數(shù)據(jù)包

InetAddress
/**
*
* InetAddressDemo
*
*
*/
public class InetAddressDemo {
public static void main(String[] args) throws IOException {
InetAddress baidu = InetAddress.getByName("www.baidu.com");
System.out.println(baidu);
System.out.println(baidu.getHostAddress());//獲取主機(jī)地址
System.out.println(baidu.isReachable(1000));//是否可達(dá)
System.out.println("====================================================================================");
InetAddress local = InetAddress.getByAddress(new byte[]{127, 0, 0, 1});
System.out.println(local.getHostName());//獲取主機(jī)名
System.out.println(local.isReachable(1000));//是否可達(dá)
}
}

案例演示 (簡(jiǎn)易聊天室)
package javaserver.TcpServer;
import JAVAClient.TcpClient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class tcpServer {
public static ExecutorService threadPool= Executors.newFixedThreadPool(10);
public static List<Socket> socketList= Collections.synchronizedList(new ArrayList<>());
public static void main(String[] args) {
//
// try {
//
// //接受客戶端的請(qǐng)求
// ServerSocket serverSocket=new ServerSocket(9000);
// while (true){
// Socket socket = serverSocket.accept();//封裝了一些客戶端的信息
// System.out.println("請(qǐng)求;" + socket.toString());
//
// PrintStream ps=new PrintStream(socket.getOutputStream());
// ps.println("welcome "+ socket.getInetAddress().getHostAddress());
// socket.close();
// }
//
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
try {
ServerSocket serverSocket = new ServerSocket(9000);
while (true){
Socket socket = serverSocket.accept();
socketList.add(socket);
threadPool.submit(new ThreadTask(socket));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ThreadTask implements Runnable{
private Socket socket;
private BufferedReader reader;
public ThreadTask(Socket socket) {
this.socket = socket;
try {
this.reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String line;
while ((line=reader.readLine())!=null){
for (Socket client: tcpServer.socketList){
String from=socket.getInetAddress().getHostAddress()+":::"+socket.getPort();
String content= from+"說(shuō)"+line;
new PrintStream(client.getOutputStream()).println(content);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package JAVAClient;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TcpClient {
public static ExecutorService threadPool= Executors.newFixedThreadPool(3);
public static void main(String[] args) throws IOException {
// Socket socket=new Socket("127.0.0.1",9000);
// BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
// String s = br.readLine();
// System.out.println(s);
Socket socket=new Socket("127.0.0.1",9000);
threadPool.submit(new ReadTask(socket));
threadPool.submit(new WriteTask(socket));
}
}
class ReadTask implements Runnable{
private Socket socket;
private BufferedReader reader;
public ReadTask(Socket socket) {
this.socket = socket;
try {
this.reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String line;
while ((line=reader.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class WriteTask implements Runnable{
private Socket socket;
private PrintStream writer;
public WriteTask(Socket socket) {
this.socket = socket;
try {
writer=new PrintStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
String line;
while ((line=scanner.nextLine())!=null){
writer.println(line);
}
}
}




UDP 演示
服務(wù)端
package javaserver.TcpServer;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UdpServer {
public static ExecutorService threadPool= Executors.newFixedThreadPool(10);
public static List<InetSocketAddress> addressesList=new ArrayList<>();
public static void main(String[] args) {
try {
DatagramSocket socket=new DatagramSocket(9001);
// 隨時(shí)通知
threadPool.submit(new SendTask(socket));
//接受訪問 并且記錄
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
while (true){
socket.receive(packet);
addressesList.add((InetSocketAddress) packet.getSocketAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class SendTask implements Runnable{
private DatagramSocket socket;
public SendTask(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
Scanner scanner = new Scanner(System.in);
String line;
while ((line= scanner.nextLine())!=null){
for (InetSocketAddress isa:UdpServer.addressesList){
byte[] buffer=line.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,isa.getAddress(),isa.getPort());
socket.send(packet);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客戶端
package JAVAClient;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UdpClient {
public static ExecutorService threadPool= Executors.newFixedThreadPool(3);
public static void main(String[] args) {
try {
DatagramSocket socket=new DatagramSocket();
// 注冊(cè)
DatagramPacket packet=new DatagramPacket(new byte[]{1},1, InetAddress.getByName("127.0.0.1"),9001);
socket.send(packet);
// 接收
threadPool.submit(new ReceiveTask(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ReceiveTask implements Runnable{
private DatagramSocket socket;
public ReceiveTask(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
while (true){
socket.receive(packet);
String line =new String(packet.getData(),0, packet.getLength());
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}




總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java處理InterruptedException異常的理論與實(shí)踐
在使用Java的過(guò)程中,有個(gè)情景或許很多人見過(guò),您在編寫一個(gè)測(cè)試程序,程序需要暫停一段時(shí)間,于是調(diào)用 Thread.sleep()。但是編譯器或 IDE 報(bào)錯(cuò)說(shuō)沒有處理檢查到的 InterruptedException。InterruptedException 是什么呢,為什么必須處理它?下面跟著小編一起來(lái)看看。2016-08-08
MyBatis的SQL執(zhí)行結(jié)果和客戶端執(zhí)行結(jié)果不一致問題排查
本文主要介紹了MyBatis的SQL執(zhí)行結(jié)果和客戶端執(zhí)行結(jié)果不一致問題排查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時(shí)機(jī)
這篇文章主要介紹了深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時(shí)機(jī),成員變量是定義在類中的變量,每個(gè)類的實(shí)例都會(huì)擁有自己的成員變量。它們的生命周期與對(duì)象的創(chuàng)建和銷毀相對(duì)應(yīng),下面我將詳細(xì)介紹它們的特點(diǎn)和生命周期,需要的朋友可以參考下2023-07-07
淺談Springmvc中的頁(yè)面跳轉(zhuǎn)問題
這篇文章主要介紹了淺談Springmvc中的頁(yè)面跳轉(zhuǎn)問題,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12
TransmittableThreadLocal線程間傳遞邏輯示例解析
這篇文章主要介紹了TransmittableThreadLocal線程間傳遞邏輯示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

