㈠ 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實用教程上的.