導航:首頁 > 文件教程 > socketio教程

socketio教程

發布時間:2023-09-03 23:43:30

java編程中,Socket通信是怎麼實現的

java編程對於Socket之間的通信過程如下:

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客戶端代碼
Java代碼publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}

}

㈡ 請教怎樣發送socket請求包,並獲得返回數據

這種東西,Google下大把吧,正好前陣子有一個TCP通訊的,借你參考下好了:

ServerSide

packagenio;

importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.net.InetSocketAddress;
importjava.net.ServerSocket;
importjava.nio.ByteBuffer;
importjava.nio.channels.SelectionKey;
importjava.nio.channels.Selector;
importjava.nio.channels.ServerSocketChannel;
importjava.nio.channels.SocketChannel;
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.Date;

publicclassEchoServer{

privatestaticintSOCKET_NUM=55555;

=newSimpleDateFormat("yyyyMMddHH:mm:ss");

/**
*@
*/
publicstaticvoidmain(String[]args){
newEchoServer().start();
}

publicvoidstart(){
try{
Selectorselector=bindServer();//綁定服務埠,並定義一個事件選擇器對象記錄套接字通道的事件

/*通過此循環來遍例事件*/
while(true){
log("Waitingevents.");
intn=selector.select();//查詢事件如果一個事件都沒有,這里就會阻塞
log("Gotevents:"+n);

ByteBufferechoBuffer=ByteBuffer.allocate(50);//定義一個byte緩沖區來存儲收發的數據

/*循環遍例所有產生的事件*/
for(SelectionKeykey:selector.selectedKeys()){
SocketChannelsc;
selector.selectedKeys().remove(key);//將本此事件從迭帶器中刪除

/*如果產生的事件為接受客戶端連接(當有客戶端連接伺服器的時候產生)*/
if((key.readyOps()&SelectionKey.OP_ACCEPT)==SelectionKey.OP_ACCEPT){

ServerSocketChannelsubssc=(ServerSocketChannel)key.channel();//定義一個伺服器socket通道

sc=subssc.accept();//將臨時socket對象實例化為接收到的客戶端的socket

sc.configureBlocking(false);//將客戶端的socket設置為非同步

sc.register(selector,SelectionKey.OP_READ);//將客戶端的socket的讀取事件注冊到事件選擇器中

System.out.println("Gotnewclient:"+sc);
}
/*如果產生的事件為讀取數據(當已連接的客戶端向伺服器發送數據的時候產生)*/
elseif((key.readyOps()&SelectionKey.OP_READ)==SelectionKey.OP_READ){

sc=(SocketChannel)key.channel();//臨時socket對象實例化為產生本事件的socket

ByteArrayOutputStreambos=newByteArrayOutputStream();//定義一個用於存儲byte數據的流對象,存儲全部信息

echoBuffer.clear();//先將客戶端的數據清空

try{
//循環讀取所有客戶端數據到byte緩沖區中,當有數據的時候read函數返回數據長度
//NIO會自動的將緩沖區一次容納不下的自動分段
intreadInt=0;//為讀取到數據的長度
while((readInt=sc.read(echoBuffer))>0){
//如果獲得數據長度比緩沖區大小小的話
if(readInt<echoBuffer.capacity()){

byte[]readByte=newbyte[readInt];//建立一個臨時byte數組,將齊長度設為獲取的數據的長度
//循環向此臨時數組中添加數據
for(inti=0;i<readInt;i++){
readByte[i]=echoBuffer.get(i);
}

bos.write(readByte);//將此數據存入byte流中
}
//否則就是獲得數據長度等於緩沖區大小
else{
bos.write(echoBuffer.array());//將讀取到的數據寫入到byte流對象中
}
}
//當循環結束時byte流中已經存儲了客戶端發送的所有byte數據
log("Recivemsg:"+newString(bos.toByteArray()));
}catch(Exceptione){

e.printStackTrace();//當客戶端在讀取數據操作執行之前斷開連接會產生異常信息

key.cancel();//將本socket的事件在選擇器中刪除
break;
}

writeBack(sc,bos.toByteArray());//向客戶端寫入收到的數據
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}

/**
*綁定服務埠,初始化整個服務
*@throwsIOException
*/
privateSelectorbindServer()throwsIOException{
log("Startbindingserversocket:"+SOCKET_NUM);

Selectorselector=Selector.open();//定義一個事件選擇器對象記錄套接字通道的事件

ServerSocketChannelssc=ServerSocketChannel.open();//定義一個非同步伺服器socket對象

ssc.configureBlocking(false);//將此socket對象設置為非同步

ServerSocketss=ssc.socket();//定義伺服器socket對象-用來指定非同步socket的監聽埠等信息

InetSocketAddressaddress=newInetSocketAddress(SOCKET_NUM);//定義存放監聽埠的對象

ss.bind(address);//將伺服器與這個埠綁定

ssc.register(selector,SelectionKey.OP_ACCEPT);//將非同步的伺服器socket對象的接受客戶端連接事件注冊到selector對象內

log("Bindedsocketat:"+SOCKET_NUM);

returnselector;
}

privatebooleanwriteBack(SocketChannelsc,byte[]b){
ByteBufferechoBuffer=ByteBuffer.allocate(b.length);//建立這個byte對象的ByteBuffer
echoBuffer.put(b);//將數據存入

echoBuffer.flip();//將緩沖區復位以便於進行其他讀寫操作
try{
//向客戶端寫入數據,數據為接受到數據
sc.write(echoBuffer);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
System.out.println("Msgechoback:"+newString(echoBuffer.array()));
returntrue;
}

privatestaticvoidlog(Objectmsg){
System.out.println("SERVER["+dateFormatter.format(newDate())+"]:"+msg);
}
}

㈢ 怎麼用java的socket進行文件傳輸誰能給個簡單的例子,包括發送端和接收端。

java中的網路信息傳輸方式是基於TCP協議或者UD協議P的,socket是基於TCP協議的

例子1
(1)客戶端程序
import java.io.*;
import java.net.*;
public class Client
{ public static void main(String args[])
{ String s=null;
Socket mysocket;
DataInputStream in=null;
DataOutputStream out=null;
try{
mysocket=new Socket("localhost",4331);
in=new DataInputStream(mysocket.getInputStream());
out=new DataOutputStream(mysocket.getOutputStream());
out.writeUTF("你好!");//通過 out向"線路"寫入信息。
while(true)
{
s=in.readUTF();//通過使用in讀取伺服器放入"線路"里的信息。堵塞狀態,
//除非讀取到信息。
out.writeUTF(":"+Math.random());
System.out.println("客戶收到:"+s);
Thread.sleep(500);
}
}
catch(IOException e)
{ System.out.println("無法連接");
}
catch(InterruptedException e){}
}
}
(2)伺服器端程序:
import java.io.*;import java.net.*;
public class Server
{ public static void main(String args[])
{ ServerSocket server=null;
Socket you=null;String s=null;
DataOutputStream out=null;DataInputStream in=null;
try{ server=new ServerSocket(4331);}
catch(IOException e1){System.out.println("ERRO:"+e1);}
try{ you=server.accept();
in=new DataInputStream(you.getInputStream());
out=new DataOutputStream(you.getOutputStream());
while(true)
{
s=in.readUTF();// 通過使用in讀取客戶放入"線路"里的信息。堵塞狀態,
//除非讀取到信息。

out.writeUTF("你好:我是伺服器");//通過 out向"線路"寫入信息.
out.writeUTF("你說的數是:"+s);
System.out.println("伺服器收到:"+s);
Thread.sleep(500);
}
}
catch(IOException e)
{ System.out.println(""+e);
}
catch(InterruptedException e){}
}
}

例子(2)
(1) 客戶端
import java.net.*;import java.io.*;
import java.awt.*;import java.awt.event.*;
import java.applet.*;
public class Computer_client extends Applet implements Runnable,ActionListener
{ Button 計算;TextField 輸入三邊長度文本框,計算結果文本框;
Socket socket=null;
DataInputStream in=null; DataOutputStream out=null;
Thread thread;
public void init()
{ setLayout(new GridLayout(2,2));
Panel p1=new Panel(),p2=new Panel();
計算=new Button(" 計算");
輸入三邊長度文本框=new TextField(12);計算結果文本框=new TextField(12);
p1.add(new Label("輸入三角形三邊的長度,用逗號或空格分隔:"));
p1.add( 輸入三邊長度文本框);
p2.add(new Label("計算結果:"));p2.add(計算結果文本框);p2.add(計算);
計算.addActionListener(this);
add(p1);add(p2);
}
public void start()
{ try
{ //和小程序所駐留的伺服器建立套接字連接:
socket = new Socket(this.getCodeBase().getHost(), 4331);
in =new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}
catch (IOException e){}
if(thread == null)
{ thread = new Thread(this);
thread.start();
}
}
public void run()
{ String s=null;
while(true)
{ try{ s=in.readUTF();//堵塞狀態,除非讀取到信息。

計算結果文本框.setText(s);
}
catch(IOException e)
{ 計算結果文本框.setText("與伺服器已斷開");
break;
}
}
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==計算)
{ String s=輸入三邊長度文本框.getText();
if(s!=null)
{ try { out.writeUTF(s);
}
catch(IOException e1){}
}
}
}
}

(2) 伺服器端
import java.io.*;import java.net.*;
import java.util.*;import java.sql.*;
public class Computer_server
{ public static void main(String args[])
{ ServerSocket server=null;Server_thread thread;
Socket you=null;
while(true)
{ try{ server=new ServerSocket(4331);
}
catch(IOException e1)
{ System.out.println("正在監聽"); //ServerSocket對象不能重復創建。
}
try{ you=server.accept();
System.out.println("客戶的地址:"+you.getInetAddress());
}
catch (IOException e)
{ System.out.println("正在等待客戶");
}
if(you!=null)
{ new Server_thread(you).start(); //為每個客戶啟動一個專門的線程。
}
else
{ continue;
}
}
}
}
class Server_thread extends Thread
{ Socket socket;Connection Con=null;Statement Stmt=null;
DataOutputStream out=null;DataInputStream in=null;int n=0;
String s=null;
Server_thread(Socket t)
{ socket=t;
try { in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch (IOException e)
{}
}
public void run()
{ while(true)
{ double a[]=new double[3] ;int i=0;
try{ s=in.readUTF();堵塞狀態,除非讀取到信息。

StringTokenizer fenxi=new StringTokenizer(s," ,");
while(fenxi.hasMoreTokens())
{ String temp=fenxi.nextToken();
try{ a[i]=Double.valueOf(temp).doubleValue();i++;
}
catch(NumberFormatException e)
{ out.writeUTF("請輸入數字字元");
}
}
double p=(a[0]+a[1]+a[2])/2.0;
out.writeUTF(" "+Math.sqrt(p*(p-a[0])*(p-a[1])*(p-a[2])));
sleep(2);
}
catch(InterruptedException e){}
catch (IOException e)
{ System.out.println("客戶離開");
break;
}
}
}
}

這些例子都是Java2實用教程上的.

閱讀全文

與socketio教程相關的資料

熱點內容
電商網站叫什麼名字好 瀏覽:726
win1014393更新 瀏覽:751
電腦計算器文件類型是多少 瀏覽:671
wsdl地址生成wsdl文件 瀏覽:798
系統會同時保存多少文件夾 瀏覽:63
勞務費app怎麼申請繳稅 瀏覽:575
dw最新版本如何建立網站 瀏覽:799
wps表格怎樣取消密碼設置密碼 瀏覽:135
老黃歷哪個網站好 瀏覽:316
rar是文件怎麼打開 瀏覽:395
java開發app的架構 瀏覽:865
ppt怎麼放音頻文件 瀏覽:874
app被騙錢怎麼找回 瀏覽:813
型動app怎麼做教練 瀏覽:364
雪佛蘭車載app怎麼樣 瀏覽:133
637的微信版本如何建百人群 瀏覽:41
外梯形螺紋怎麼編程 瀏覽:986
vs2010vb工具箱 瀏覽:938
win10重裝多少錢 瀏覽:662
資料庫系統由什麼什麼等構成 瀏覽:413

友情鏈接