package?com.weixin.test;
成都創(chuàng)新互聯(lián)是一家專業(yè)提供蘭陵企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為蘭陵眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.OutputStream;
import?java.net.InetAddress;
import?java.net.ServerSocket;
import?java.net.Socket;
import?org.junit.Test;
public?class?ScoketTest?{
@Test
public?void?client()?throws?Exception{
InetAddress?i=InetAddress.getByName("127.0.0.1");
Socket?s=new?Socket(i,?9000);
OutputStream?outputStream?=?s.getOutputStream();
outputStream.write("服務(wù)端你好,我是客戶端哦!".getBytes());
s.shutdownOutput();
InputStream?inputStream=s.getInputStream();
int?length=0;
byte[]?bytes=new?byte[1024];
while?((length=inputStream.read(bytes))!=-1)?{
System.err.println(new?String(bytes,0,length));
}
inputStream.close();
outputStream.close();
s.close();
}
@Test
public?void?server()?throws?Exception{
ServerSocket?serverSocket=new?ServerSocket(9000);
Socket?socket?=?serverSocket.accept();
InputStream?inputStream?=?socket.getInputStream();
OutputStream?outputStream?=?socket.getOutputStream();
int?length=0;
byte[]?bytes=new?byte[1024];
while?((length=inputStream.read(bytes))!=-1)?{
System.err.println(new?String(bytes,?0,length));
}
outputStream.write("客戶端你好,本王已收到!".getBytes());
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
你說(shuō)的我明白。如果真正使用alohal協(xié)議的時(shí)候,所有的機(jī)器都可以檢測(cè)網(wǎng)絡(luò)電平變化的是吧?但是使用Java編寫(xiě)模擬程序的話,我們并不能可能檢測(cè)電平的變換,只能通過(guò)一定的手段來(lái)模擬這個(gè)過(guò)程。如果你將一個(gè)包裹群發(fā),這樣所有的機(jī)器都可以接受這個(gè)包,這樣就可以做到所有機(jī)器模擬檢測(cè)電平變化的這個(gè)要求。我認(rèn)為這個(gè)是最有說(shuō)服力的模擬方法了。
線程需要使用Thread類型,重寫(xiě)里面的run函數(shù),調(diào)用start()啟動(dòng)線程,具體可以搜索一把Thread,例子遍地都是。
UDP協(xié)議使用Socket類型,初始化的時(shí)候參數(shù)里面綁定(或者初始化好以后直接調(diào)用bind綁定端口,一般輸出不用綁定,監(jiān)聽(tīng)的時(shí)候需要綁定)。調(diào)用里面的getOutputStream得到輸入流。調(diào)用getInputStream得到輸入流。
OutputStream:輸出流,用于向網(wǎng)絡(luò)中輸出數(shù)據(jù)。調(diào)用其中的write函數(shù)進(jìn)行輸出,函數(shù)的參數(shù)就是輸出的byte數(shù)組。
InputStream: 輸入流,用于接受網(wǎng)絡(luò)里面的數(shù)據(jù)。調(diào)用其中的read可以得到輸入的包。
String:你要輸出的字符串,調(diào)用里面的getBytes可以得到String的byte數(shù)組。
其它的應(yīng)該用不到什么了吧。
**********************************
1.發(fā)送字符串的話用byte[]就可以啊。用Socket類里面的getOutputStream可以獲得一個(gè)發(fā)送數(shù)據(jù)的OutputStream類對(duì)象。這個(gè)類對(duì)象有一個(gè)函數(shù)write(byte[] b) 可以向網(wǎng)絡(luò)寫(xiě)byte[]。一個(gè)字符串可以通過(guò)String類中的getBytes() 轉(zhuǎn)化成byte[]。這樣總該明白了吧
2.說(shuō)一下我的思路:開(kāi)一個(gè)端口A發(fā)送UDP包(廣播給端口B),用于模擬發(fā)送,用一個(gè)線程(線程1)來(lái)跑。開(kāi)端口B接受局域網(wǎng)內(nèi)的包,用另外一個(gè)線程(線程2)來(lái)跑。在發(fā)送UDP包的時(shí)候,將變量mark置1,發(fā)送完置0。線程2如果接受到一個(gè)不是從本機(jī)發(fā)送的包,而且此時(shí)mark是1(說(shuō)明本機(jī)和另外一個(gè)機(jī)器同時(shí)在發(fā)包),發(fā)生了沖突,表示線程1這次發(fā)送的包失敗。
網(wǎng)絡(luò)上的系統(tǒng)結(jié)構(gòu)多為客戶/服務(wù)器模式 服務(wù)器端負(fù)責(zé)數(shù)據(jù)和圖像等的存儲(chǔ) 維護(hù) 治理以及傳遞 客戶端則負(fù)責(zé)人機(jī)界面的操作 送出需求及顯示收回的數(shù)據(jù) 下面介紹一下如何使用Java來(lái)進(jìn)行網(wǎng)絡(luò)編程 ) 由于客戶端通過(guò)IE同服務(wù)器建立聯(lián)系 所以客戶端使用Applet 服務(wù)器端使用Application ) 服務(wù)器應(yīng)設(shè)置成多線程 應(yīng)答多個(gè)客戶的請(qǐng)求 ) 兩端通信使用SOCKET機(jī)制 Java中輸入/輸出流概念 過(guò)濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外 還分別實(shí)現(xiàn)了接口DataInput 和DataOutput 接口DataInput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù) 讀取一行數(shù)據(jù) 或者讀取指定長(zhǎng)度的字節(jié)數(shù) 如readBoolean() readInt() readLine() readFully()等 接口DataOutput中定義的方法主要是向流中寫(xiě)入基本類型的數(shù)據(jù)或者寫(xiě)入一定長(zhǎng)度的字節(jié)數(shù)組 如writeChar() writeDouble() DataInputStream可以從所連接的輸入流中讀取與機(jī)器無(wú)關(guān)的基本類型數(shù)據(jù) 用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式 DataInputStream 可以向所連接的輸出流寫(xiě)入基本類型的數(shù)據(jù) Socket 機(jī)制 Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的 網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換 這個(gè)雙向鏈路的一端稱為一個(gè)Socket Socket通常用來(lái)實(shí)現(xiàn)客戶方和服務(wù)方的連接 客戶程序可以向Socket寫(xiě)請(qǐng)求 服務(wù)器將處理此請(qǐng)求 然后通過(guò)Socket將結(jié)果返回給用戶 Socket通信機(jī)制提供了兩種通訊方式 有聯(lián)接和無(wú)聯(lián)接方式 分別面向不同的應(yīng)用需求 使用有聯(lián)接方式時(shí) 通信鏈路提供了可靠的 全雙工的字節(jié)流服務(wù) 在該方式下 通信雙方必須創(chuàng)建一個(gè)聯(lián)接過(guò)程并建立一條通訊鏈路 以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行 通信完畢關(guān)閉此聯(lián)接過(guò)程 使用無(wú)聯(lián)接方式時(shí)其系統(tǒng)開(kāi)銷比無(wú)聯(lián)接方式小 但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù) 不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿 在該方式下 通信雙方不必創(chuàng)建一個(gè)聯(lián)接過(guò)程和建立一條通訊鏈路 網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行 Java語(yǔ)言簡(jiǎn)介Java語(yǔ)言的優(yōu)點(diǎn)主要表現(xiàn)在 簡(jiǎn)單 面向?qū)ο?多線程 分布性 體系結(jié)構(gòu)中立 安全性等方面 ( ) 簡(jiǎn)單性Java與C++語(yǔ)言非常相近 但Java比C++簡(jiǎn)單 它拋棄了C++中的一些不是絕對(duì)必要的功能 如頭文件 預(yù)處理文件 指針 結(jié)構(gòu) 運(yùn)算符重載 多重繼續(xù)以及自動(dòng)強(qiáng)迫同型 Java實(shí)現(xiàn)了自動(dòng)的垃圾收集 簡(jiǎn)化了內(nèi)存治理的工作 這使程序設(shè)計(jì)更加簡(jiǎn)便 同時(shí)減少了出錯(cuò)的可能 ( ) 面向?qū)ο驤ava提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型 對(duì)象中封裝了它的狀態(tài)變量和方法 很好地實(shí)現(xiàn)了模塊化和信息隱藏 而類則提供了一類對(duì)象的原型 通過(guò)繼續(xù)和重載機(jī)制 子類可以使用或重新定義父類或超類所提供的方法 從而既實(shí)現(xiàn)了代碼的復(fù)用 又提供了一種動(dòng)態(tài)的解決方案 Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言 它除了數(shù)組 布爾和字符三個(gè)基本數(shù)據(jù)類型外的其它類都是對(duì)象 它不再支持全局變量 在Java中 假如不創(chuàng)建新類就無(wú)法創(chuàng)建程序 Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例 然后才能提交運(yùn)行 Java同樣支持繼續(xù)特性 Java的類可以從其它類中繼續(xù)行為 但Java只支持類的單重繼續(xù) 即每個(gè)類只能從一個(gè)類中繼續(xù) Java支持界面 界面答應(yīng)程序員定義方法但又不立即實(shí)現(xiàn) 一個(gè)類可以實(shí)現(xiàn)多個(gè)界面 利用界面可以得到多重繼續(xù)的許多優(yōu)點(diǎn)而又沒(méi)有多重繼續(xù)的問(wèn)題 ( ) 多線程多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作 處理不同的事件 在多線程機(jī)制中 不同的線程處理不同的任務(wù) 他們之間互不干涉 不會(huì)由于一處等待影響其他部分 這樣輕易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作 Java程序可以有多個(gè)執(zhí)行線程 如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算 而讓另一個(gè)線程與用戶進(jìn)行交互 這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互 多線程保證了較高的執(zhí)行效率 ( ) 分布性Java是面向網(wǎng)絡(luò)的語(yǔ)言 通過(guò)它提供的類庫(kù)可以處理TCP/IP協(xié)議 用戶可以通過(guò)URL地址在網(wǎng)絡(luò)上很方便的訪問(wèn)其他對(duì)象 ( ) 體系結(jié)構(gòu)中立Java是一種網(wǎng)絡(luò)語(yǔ)言 為使Java程序能在網(wǎng)絡(luò)的任何地方運(yùn)行 Java解釋器生成與體系結(jié)構(gòu)無(wú)關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式 Java為了做到結(jié)構(gòu)中立 除生成機(jī)器無(wú)關(guān)的字節(jié)碼外 還制定了完全統(tǒng)一的語(yǔ)言文本 如Java的基本數(shù)據(jù)類型不會(huì)隨目標(biāo)機(jī)的變化而變化 一個(gè)整型總是 位 一個(gè)長(zhǎng)整型總是 位 為了使Java的應(yīng)用程序能不依靠于具體的系統(tǒng) Java語(yǔ)言環(huán)境還提供了用于訪問(wèn)底層操作系統(tǒng)功能的類組成的包 當(dāng)程序使用這些包時(shí) 可以確保它能運(yùn)行在各種支持Java的平臺(tái)上 lishixinzhi/Article/program/Java/hx/201311/25926
/**
* 基于UDP協(xié)議的聊天程序
*
* 2007.9.18
* */
//導(dǎo)入包
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.net.*;
public class Chat extends JFrame implements ActionListener
{
//廣播地址或者對(duì)方的地址
public static final String sendIP = "172.18.8.255";
//發(fā)送端口9527
public static final int sendPort = 9527;
JPanel p = new JPanel();
List lst = new List(); //消息顯示
JTextField txtIP = new JTextField(18); //填寫(xiě)IP地址
JTextField txtMSG = new JTextField(20); //填寫(xiě)發(fā)送消息
JLabel lblIP = new JLabel("IP地址:");
JLabel lblMSG = new JLabel("消息:");
JButton btnSend = new JButton("發(fā)送");
byte [] buf;
//定義DatagramSocket的對(duì)象必須進(jìn)行異常處理
//發(fā)送和接收數(shù)據(jù)報(bào)包的套接字
DatagramSocket ds = null;
//=============構(gòu)造函數(shù)=====================
public Chat()
{
CreateInterFace();
//注冊(cè)消息框監(jiān)聽(tīng)器
txtMSG.addActionListener(this);
btnSend.addActionListener(this);
try
{
//端口:9527
ds =new DatagramSocket(sendPort);
}
catch(Exception ex)
{
ex.printStackTrace();
}
//============接受消息============
//匿名類
new Thread(new Runnable()
{
public void run()
{
byte buf[] = new byte[1024];
//表示接受數(shù)據(jù)報(bào)包
while(true)
{
try
{
DatagramPacket dp = new DatagramPacket(buf,1024,InetAddress.getByName(txtIP.getText()),sendPort);
ds.receive(dp);
lst.add("【消息來(lái)自】◆" + dp.getAddress().getHostAddress() + "◆"+"【說(shuō)】:" + new String (buf,0,dp.getLength()) /*+ dp.getPort()*/,0);
}
catch(Exception e)
{
if(ds.isClosed())
{
e.printStackTrace();
}
}
}
}
}).start();
//關(guān)閉窗體事件
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
System.out.println("test");
int n=JOptionPane.showConfirmDialog(null,"是否要退出?","退出",JOptionPane.YES_NO_OPTION);
if(n==JOptionPane.YES_OPTION)
{
dispose();
System.exit(0);
ds.close();//關(guān)閉ds對(duì)象//關(guān)閉數(shù)據(jù)報(bào)套接字
}
}
});
}
//界面設(shè)計(jì)布局
public void CreateInterFace()
{
this.add(lst,BorderLayout.CENTER);
this.add(p,BorderLayout.SOUTH);
p.add(lblIP);
p.add(txtIP);
p.add(lblMSG);
p.add(txtMSG);
p.add(btnSend);
txtIP.setText(sendIP);
//背景顏色
lst.setBackground(Color.yellow);
//JAVA默認(rèn)風(fēng)格
this.setUndecorated(true);
this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
this.setSize(600,500);
this.setTitle("〓聊天室〓");
this.setResizable(false);//不能改變窗體大小
this.setLocationRelativeTo(null);//窗體居中
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setVisible(true);
txtMSG.requestFocus();//消息框得到焦點(diǎn)
}
//===============================Main函數(shù)===============================
public static void main(String[]args)
{
new Chat();
}
//================================發(fā)送消息===============================
//消息框回車發(fā)送消息事件
public void actionPerformed(ActionEvent e)
{
//得到文本內(nèi)容
buf = txtMSG.getText().getBytes();
//判斷消息框是否為空
if (txtMSG.getText().length()==0)
{
JOptionPane.showMessageDialog(null,"發(fā)送消息不能為空","提示",JOptionPane.WARNING_MESSAGE);
}
else{
try
{
InetAddress address = InetAddress.getByName(sendIP);
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort);
ds.send(dp);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
txtMSG.setText("");//清空消息框
//點(diǎn)發(fā)送按鈕發(fā)送消息事件
if(e.getSource()==btnSend)
{
buf = txtMSG.getText().getBytes();
try
{
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort);
}
catch(Exception ex)
{
ex.printStackTrace();
}
txtMSG.setText("");//清空消息框
txtMSG.requestFocus();
}
}
}
Java中封裝了大量的socket API 為編寫(xiě)網(wǎng)絡(luò)通信程序提供了極大的方便 在計(jì)算機(jī)網(wǎng)絡(luò)的學(xué)習(xí)中 大家都已熟練掌握了TCP/UDP的基本原理 在此不在贅述 僅給出接收端和發(fā)送端的源代碼 供大家討論學(xué)習(xí) 發(fā)送端代碼如下:import java io *;import java lang *;import *;public class uclient{private DatagramSocket cli;private DatagramPacket pac;private byte *** [];private String sen;public uclient(){Init();}public void Init(){try{//指定端口號(hào) 避免與其他應(yīng)用程序發(fā)生沖突cli=new DatagramSocket( ); *** =new byte[ ];sen= UDP方式發(fā)送數(shù)據(jù) ; *** =sen getBytes();pac=new DatagramPacket( *** *** length InetAddress getByName( localhost ) );cli send(pac);}catch(SocketException se){se printStackTrace();}catch(IOException ie){ie printStackTrace();}}public static void main(String args[]){new uclient();}}接收端數(shù)據(jù):import java io *;import java lang *;import *;public class userve{private DatagramSocket ser;private DatagramPacket pac;private byte rb[];private String rev;public userve(){Init();}public void Init(){try{ser=new DatagramSocket( );rb=new byte[ ];pac=new DatagramPacket(rb rb length);rev= ;int i= ;while(i== )//無(wú)數(shù)據(jù) 則循環(huán){ser receive(pac);i=pac getLength();//接收數(shù)據(jù)if(i ){//指定接收到數(shù)據(jù)的長(zhǎng)度 可使接收數(shù)據(jù)正常顯示 開(kāi)始時(shí)很容易忽略這一點(diǎn)rev=new String(rb pac getLength());System out println(rev);i= ;//循環(huán)接收}}}catch(Exception e){e printStackTrace();}}public static void main(String args[]){new userve();}} lishixinzhi/Article/program/Java/hx/201311/26023
當(dāng)前文章:網(wǎng)絡(luò)通訊java代碼 網(wǎng)絡(luò)通信代碼
文章鏈接:http://aaarwkj.com/article24/doodoje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、標(biāo)簽優(yōu)化、網(wǎng)站制作、定制網(wǎng)站、自適應(yīng)網(wǎng)站、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)