package?com.weixin.test;
成都創新互聯是一家專業提供蘭陵企業網站建設,專注與成都網站建設、網站制作、html5、小程序制作等業務。10年已為蘭陵眾多企業、政府機構等服務。創新互聯專業網絡公司優惠進行中。
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("服務端你好,我是客戶端哦!".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();
}
}
你說的我明白。如果真正使用alohal協議的時候,所有的機器都可以檢測網絡電平變化的是吧?但是使用Java編寫模擬程序的話,我們并不能可能檢測電平的變換,只能通過一定的手段來模擬這個過程。如果你將一個包裹群發,這樣所有的機器都可以接受這個包,這樣就可以做到所有機器模擬檢測電平變化的這個要求。我認為這個是最有說服力的模擬方法了。
線程需要使用Thread類型,重寫里面的run函數,調用start()啟動線程,具體可以搜索一把Thread,例子遍地都是。
UDP協議使用Socket類型,初始化的時候參數里面綁定(或者初始化好以后直接調用bind綁定端口,一般輸出不用綁定,監聽的時候需要綁定)。調用里面的getOutputStream得到輸入流。調用getInputStream得到輸入流。
OutputStream:輸出流,用于向網絡中輸出數據。調用其中的write函數進行輸出,函數的參數就是輸出的byte數組。
InputStream: 輸入流,用于接受網絡里面的數據。調用其中的read可以得到輸入的包。
String:你要輸出的字符串,調用里面的getBytes可以得到String的byte數組。
其它的應該用不到什么了吧。
**********************************
1.發送字符串的話用byte[]就可以啊。用Socket類里面的getOutputStream可以獲得一個發送數據的OutputStream類對象。這個類對象有一個函數write(byte[] b) 可以向網絡寫byte[]。一個字符串可以通過String類中的getBytes() 轉化成byte[]。這樣總該明白了吧
2.說一下我的思路:開一個端口A發送UDP包(廣播給端口B),用于模擬發送,用一個線程(線程1)來跑。開端口B接受局域網內的包,用另外一個線程(線程2)來跑。在發送UDP包的時候,將變量mark置1,發送完置0。線程2如果接受到一個不是從本機發送的包,而且此時mark是1(說明本機和另外一個機器同時在發包),發生了沖突,表示線程1這次發送的包失敗。
網絡上的系統結構多為客戶/服務器模式 服務器端負責數據和圖像等的存儲 維護 治理以及傳遞 客戶端則負責人機界面的操作 送出需求及顯示收回的數據 下面介紹一下如何使用Java來進行網絡編程 ) 由于客戶端通過IE同服務器建立聯系 所以客戶端使用Applet 服務器端使用Application ) 服務器應設置成多線程 應答多個客戶的請求 ) 兩端通信使用SOCKET機制 Java中輸入/輸出流概念 過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外 還分別實現了接口DataInput 和DataOutput 接口DataInput 中定義的方法主要包括從流中讀取基本類型的數據 讀取一行數據 或者讀取指定長度的字節數 如readBoolean() readInt() readLine() readFully()等 接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組 如writeChar() writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據 用以實現一種獨立于具體平臺的輸入方式 DataInputStream 可以向所連接的輸出流寫入基本類型的數據 Socket 機制 Socket是面向客戶/服務器模型設計的 網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換 這個雙向鏈路的一端稱為一個Socket Socket通常用來實現客戶方和服務方的連接 客戶程序可以向Socket寫請求 服務器將處理此請求 然后通過Socket將結果返回給用戶 Socket通信機制提供了兩種通訊方式 有聯接和無聯接方式 分別面向不同的應用需求 使用有聯接方式時 通信鏈路提供了可靠的 全雙工的字節流服務 在該方式下 通信雙方必須創建一個聯接過程并建立一條通訊鏈路 以后的網絡通信操作完全在這一對進程之間進行 通信完畢關閉此聯接過程 使用無聯接方式時其系統開銷比無聯接方式小 但通信鏈路提供了不可靠的數據報服務 不能保證信源所傳輸的數據一定能夠到達信宿 在該方式下 通信雙方不必創建一個聯接過程和建立一條通訊鏈路 網絡通信操作在不同的主機和進程之間轉發進行 Java語言簡介Java語言的優點主要表現在 簡單 面向對象 多線程 分布性 體系結構中立 安全性等方面 ( ) 簡單性Java與C++語言非常相近 但Java比C++簡單 它拋棄了C++中的一些不是絕對必要的功能 如頭文件 預處理文件 指針 結構 運算符重載 多重繼續以及自動強迫同型 Java實現了自動的垃圾收集 簡化了內存治理的工作 這使程序設計更加簡便 同時減少了出錯的可能 ( ) 面向對象Java提供了簡單的類機制和動態的構架模型 對象中封裝了它的狀態變量和方法 很好地實現了模塊化和信息隱藏 而類則提供了一類對象的原型 通過繼續和重載機制 子類可以使用或重新定義父類或超類所提供的方法 從而既實現了代碼的復用 又提供了一種動態的解決方案 Java是一種完全面向對象的程序設計語言 它除了數組 布爾和字符三個基本數據類型外的其它類都是對象 它不再支持全局變量 在Java中 假如不創建新類就無法創建程序 Java程序在運行時必須先創建一個類的實例 然后才能提交運行 Java同樣支持繼續特性 Java的類可以從其它類中繼續行為 但Java只支持類的單重繼續 即每個類只能從一個類中繼續 Java支持界面 界面答應程序員定義方法但又不立即實現 一個類可以實現多個界面 利用界面可以得到多重繼續的許多優點而又沒有多重繼續的問題 ( ) 多線程多線程使應用程序可以同時進行不同的操作 處理不同的事件 在多線程機制中 不同的線程處理不同的任務 他們之間互不干涉 不會由于一處等待影響其他部分 這樣輕易實現網絡上的實時交互操作 Java程序可以有多個執行線程 如可以讓一個線程進行復雜的計算 而讓另一個線程與用戶進行交互 這樣用戶可以在不中斷計算線程的前提下與系統進行交互 多線程保證了較高的執行效率 ( ) 分布性Java是面向網絡的語言 通過它提供的類庫可以處理TCP/IP協議 用戶可以通過URL地址在網絡上很方便的訪問其他對象 ( ) 體系結構中立Java是一種網絡語言 為使Java程序能在網絡的任何地方運行 Java解釋器生成與體系結構無關的字節碼結構的文件格式 Java為了做到結構中立 除生成機器無關的字節碼外 還制定了完全統一的語言文本 如Java的基本數據類型不會隨目標機的變化而變化 一個整型總是 位 一個長整型總是 位 為了使Java的應用程序能不依靠于具體的系統 Java語言環境還提供了用于訪問底層操作系統功能的類組成的包 當程序使用這些包時 可以確保它能運行在各種支持Java的平臺上 lishixinzhi/Article/program/Java/hx/201311/25926
/**
* 基于UDP協議的聊天程序
*
* 2007.9.18
* */
//導入包
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
{
//廣播地址或者對方的地址
public static final String sendIP = "172.18.8.255";
//發送端口9527
public static final int sendPort = 9527;
JPanel p = new JPanel();
List lst = new List(); //消息顯示
JTextField txtIP = new JTextField(18); //填寫IP地址
JTextField txtMSG = new JTextField(20); //填寫發送消息
JLabel lblIP = new JLabel("IP地址:");
JLabel lblMSG = new JLabel("消息:");
JButton btnSend = new JButton("發送");
byte [] buf;
//定義DatagramSocket的對象必須進行異常處理
//發送和接收數據報包的套接字
DatagramSocket ds = null;
//=============構造函數=====================
public Chat()
{
CreateInterFace();
//注冊消息框監聽器
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];
//表示接受數據報包
while(true)
{
try
{
DatagramPacket dp = new DatagramPacket(buf,1024,InetAddress.getByName(txtIP.getText()),sendPort);
ds.receive(dp);
lst.add("【消息來自】◆" + dp.getAddress().getHostAddress() + "◆"+"【說】:" + new String (buf,0,dp.getLength()) /*+ dp.getPort()*/,0);
}
catch(Exception e)
{
if(ds.isClosed())
{
e.printStackTrace();
}
}
}
}
}).start();
//關閉窗體事件
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();//關閉ds對象//關閉數據報套接字
}
}
});
}
//界面設計布局
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默認風格
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();//消息框得到焦點
}
//===============================Main函數===============================
public static void main(String[]args)
{
new Chat();
}
//================================發送消息===============================
//消息框回車發送消息事件
public void actionPerformed(ActionEvent e)
{
//得到文本內容
buf = txtMSG.getText().getBytes();
//判斷消息框是否為空
if (txtMSG.getText().length()==0)
{
JOptionPane.showMessageDialog(null,"發送消息不能為空","提示",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("");//清空消息框
//點發送按鈕發送消息事件
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 為編寫網絡通信程序提供了極大的方便 在計算機網絡的學習中 大家都已熟練掌握了TCP/UDP的基本原理 在此不在贅述 僅給出接收端和發送端的源代碼 供大家討論學習 發送端代碼如下: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{//指定端口號 避免與其他應用程序發生沖突cli=new DatagramSocket( ); *** =new byte[ ];sen= UDP方式發送數據 ; *** =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();}}接收端數據: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== )//無數據 則循環{ser receive(pac);i=pac getLength();//接收數據if(i ){//指定接收到數據的長度 可使接收數據正常顯示 開始時很容易忽略這一點rev=new String(rb pac getLength());System out println(rev);i= ;//循環接收}}}catch(Exception e){e printStackTrace();}}public static void main(String args[]){new userve();}} lishixinzhi/Article/program/Java/hx/201311/26023
當前文章:網絡通訊java代碼 網絡通信代碼
文章鏈接:http://vcdvsql.cn/article24/doodoje.html
成都網站建設公司_創新互聯,為您提供虛擬主機、標簽優化、網站制作、定制網站、自適應網站、App設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯