⑴ 使用java socket怎麼能夠實現將一個客戶端發送到服務端的消息轉發到另一個客戶端
用一個集合記住所有客戶的Socket,收到數據包,就根據收發要求,轉發
⑵ java中用serverSocket類如何向指定IP的客戶端發送數據
byte[]buf;數據
InetAddressaddress=InetAddress.getByName(IP地址);
DatagramPacketdp=newDatagramPacket(buf,buf.length,address,Integer.parseInt(埠號));
DatagramSocketds=newDatagramSocket();
這種就可以發送數據
⑶ java中客戶端用socket連接上服務端之後一直沒有斷開,不定時給服務端發送數據,伺服器端如何知道
如果是一對一的話,不要用到線程,相當於一個1對1的聊天。主要是這,你看下
try{t.setText("服務端開啟,等待客戶端連接");
ss=new ServerSocket(50000);
}catch(IOException e){
System.err.println("無法在50000埠建立監聽服務");
System.exit(1);
}
try{ s=ss.accept();
fstart=true;
t.append("\n和來自"+s.getInetAddress()+"客戶端連接成功!\n");
t.append("\n你現在可以通信了");
dis=new DataInputStream(s.getInputStream());
kehu[1]=dis.readUTF();
}catch(IOException e){
System.err.println("和客戶端建立服務失敗");
System.exit(1);
}
try{
while(true){
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
t.append("\n客戶端1:"+dis.readUTF());
}
}catch(IOException e){
}
}
⑷ java socket 客戶端是如何向伺服器端發送消息的
伺服器端和客戶端都是通過SOCKET來進行通信的,首先產生一個 socket實例,通過這個實例,伺服器端調用accept這個方法接收來自客戶端發送的信息.但是在產生socket實例的時候必須初始化一個埠.用來負責接受客戶端的請求!
客戶端要給伺服器發送消息也必須產生一個socket實例,初始化的時候必須指定伺服器的IP地址,並且指定服務接收的埠號,這樣客戶端才能找到伺服器要接收的地方,找到地方就可以發送過去了。和你寫信一樣。找到地址
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
這個只是用來獲取一個從鍵盤的一個流.傳送給伺服器端的數據都是通過流來表示的。意思是是鍵盤輸入的一個位元組轉化成字元流.並輸出或者寫入!
⑸ java或者scala寫socket客戶端發送頭消息和消息體到服務端並接收返回信息,這個頭消息怎麼寫
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static final String IP_ADDR = "localhost";//伺服器地址
public static final int PORT = 12345;//伺服器埠號
public static void main(String[] args) {
System.out.println("客戶端啟動...");
System.out.println("當接收到伺服器端字元為 \"OK\" 的時候, 客戶端將終止\n");
while (true) {
Socket socket = null;
try {
//創建一個流套接字並將其連接到指定主機上的指定埠升棚號
socket = new Socket(IP_ADDR, PORT);
//讀取伺服器端數據
DataInputStream input = new DataInputStream(socket.getInputStream());
//向服務衫寬器端發送數據
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("請輸入: \t");
String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(str);
String ret = input.readUTF();
System.out.println("伺服器端返回過來的是: " + ret);
// 如接收到 "OK" 則斷開連接
if ("OK".equals(ret)) {
System.out.println("客戶端將關閉連接");
Thread.sleep(500);
break;
}
out.close();
input.close();
} catch (Exception e) {
System.out.println("客戶吵塌則端異常:" + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
socket = null;
System.out.println("客戶端 finally 異常:" + e.getMessage());
}
}
}
}
}
}
⑹ java socket伺服器發送信息給指定的客戶端
一個客戶端socket對象連接成功時,你保持這個連接狀態不關閉,只要用這個對象發送的就談答輪只會到那個客戶端。
如果是短連接的話,你就需要用客戶端的標識來保存好這個message,等舉掘下次客戶端再連接的時候,用含信標識找到message,然後發送給它。
⑺ java socket編程,客戶端發送文件給伺服器,伺服器接收到文件後如何返回確認信息告訴客戶端文件已接收
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.net.ServerSocket;
importjava.net.Socket;
/**
*
*文件名:ServerReceive.java
*實現功能:作為伺服器接收客戶端發送的文件
*
*具體實現過程:
*1、建立SocketServer,等待客戶端的連接
*2、當有客戶端連接的時候,按照雙方的約定,這時要讀取一行數據
*其中保存客戶端要發送的文件名和文件大小信息
*3、根據文件名在本地創建文件,並建立好流通信
*4、循環接收數據包,將數據包寫入文件
*5、當接收數據的長度等於提前文件發過來的文件長度,即表示文件接收完畢,關閉文件
*6、文件接收工作結束
*
*
*【註:此代碼僅為演示客戶端與伺服器傳送文件使用,
*每一個數據包之前沒有文件協議命令
*具體的協議傳輸和文件傳出的使用階段可根據自己程序自行放置】
*
*
*作者:小菜鳥
*創建時間:2014-08-19
*
**/
publicclassServerReceive{
publicstaticvoidmain(String[]args){
/**與伺服器建立連接的通信句柄*/
ServerSocketss=null;
Sockets=null;
/**定義用於在接收後在本地創建的文件對象和文件輸出流對象*/
Filefile=null;
FileOutputStreamfos=null;
/**定義輸入流,使用socket的inputStream對數據包進行輸入*/
InputStreamis=null;
/**定義byte數組來作為數據包的存儲數據包*/
byte[]buffer=newbyte[4096*5];
/**用來接收文件發送請求的字元串*/
Stringcomm=null;
/**建立socekt通信,等待伺服器進行連接*/
try{
ss=newServerSocket(4004);
s=ss.accept();
}catch(IOExceptione){
e.printStackTrace();
}
/**讀取一行客戶端發送過來的約定信息*/
try{
InputStreamReaderisr=newInputStreamReader(s.getInputStream());
BufferedReaderbr=newBufferedReader(isr);
comm=br.readLine();
}catch(IOExceptione){
System.out.println("伺服器與客戶端斷開連接");
}
/**開始解析客戶端發送過來的請求命令*/
intindex=comm.indexOf("/#");
/**判斷協議是否為發送文件的協議*/
Stringxieyi=comm.substring(0,index);
if(!xieyi.equals("111")){
System.out.println("伺服器收到的協議碼不正確");
return;
}
/**解析出文件的名字和大小*/
comm=comm.substring(index+2);
index=comm.indexOf("/#");
Stringfilename=comm.substring(0,index).trim();
Stringfilesize=comm.substring(index+2).trim();
/**創建空文件,用來進行接收文件*/
file=newFile(filename);
if(!file.exists()){
try{
file.createNewFile();
}catch(IOExceptione){
System.out.println("伺服器端創建文件失敗");
}
}else{
/**在此也可以詢問是否覆蓋*/
System.out.println("本路徑已存在相同文件,進行覆蓋");
}
/**【以上就是客戶端代碼中寫到的伺服器的准備部分】*/
/**
*伺服器接收文件的關鍵代碼*/
try{
/**將文件包裝到文件輸出流對象中*/
fos=newFileOutputStream(file);
longfile_size=Long.parseLong(filesize);
is=s.getInputStream();
/**size為每次接收數據包的長度*/
intsize=0;
/**count用來記錄已接收到文件的長度*/
longcount=0;
/**使用while循環接收數據包*/
while(count<file_size){
/**從輸入流中讀取一個數據包*/
size=is.read(buffer);
/**將剛剛讀取的數據包寫到本地文件中去*/
fos.write(buffer,0,size);
fos.flush();
/**將已接收到文件的長度+size*/
count+=size;
System.out.println("伺服器端接收到數據包,大小為"+size);
}
}catch(FileNotFoundExceptione){
System.out.println("伺服器寫文件失敗");
}catch(IOExceptione){
System.out.println("伺服器:客戶端斷開連接");
}finally{
/**
*將打開的文件關閉
*如有需要,也可以在此關閉socket連接
**/
try{
if(fos!=null)
fos.close();
}catch(IOExceptione){
e.printStackTrace();
}//catch(IOExceptione)
}//finally
}//publicstaticvoidmain(String[]args)
}//publicclassServerReceive
⑻ 用Java socket 實現客戶端與伺服器之間的數據的發送與接受。。。雙向的
下面是一個簡單的通訊實例,進行Server和Client之間的文件傳輸。。如果是簡單的文本傳輸的話簡化掉文本操作的內容即可。。
1.伺服器端
package sterning;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
int port = 8821;
void start() {
Socket s = null;
try {
ServerSocket ss = new ServerSocket(port);
while (true) {
// 選擇進行傳輸的文件
String filePath = "D:\\lib.rar";
File fi = new File(filePath);
System.out.println("文件長度:" + (int) fi.length());
// public Socket accept() throws
// IOException偵聽並接受到此套接字的連接。此方法在進行連接之前一直阻塞。
s = ss.accept();
System.out.println("建立socket鏈接");
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
//將文件名及長度傳給客戶端。這里要真正適用所有平台,例如中文名的處理,還需要加工,具體可以參見Think In Java 4th里有現成的代碼。
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
while (true) {
int read = 0;
if (fis != null) {
read = fis.read(buf);
}
if (read == -1) {
break;
}
ps.write(buf, 0, read);
}
ps.flush();
// 注意關閉socket鏈接哦,不然客戶端會等待server的數據過來,
// 直到socket超時,導致數據不完整。
fis.close();
s.close();
System.out.println("文件傳輸完成");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
2.socket的Util輔助類
package sterning;
import java.net.*;
import java.io.*;
public class ClientSocket {
private String ip;
private int port;
private Socket socket = null;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
/** *//**
* 創建socket連接
*
* @throws Exception
* exception
*/
public void CreateConnection() throws Exception {
try {
socket = new Socket(ip, port);
} catch (Exception e) {
e.printStackTrace();
if (socket != null)
socket.close();
throw e;
} finally {
}
}
public void sendMessage(String sendMessage) throws Exception {
try {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
return;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
return;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} else {
out.writeUTF(sendMessage);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
if (out != null)
out.close();
throw e;
} finally {
}
}
public DataInputStream getMessageStream() throws Exception {
try {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
return getMessageStream;
} catch (Exception e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
throw e;
} finally {
}
}
public void shutDownConnection() {
try {
if (out != null)
out.close();
if (getMessageStream != null)
getMessageStream.close();
if (socket != null)
socket.close();
} catch (Exception e) {
}
}
}
3.客戶端
package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class ClientTest {
private ClientSocket cs = null;
private String ip = "localhost";// 設置成伺服器IP
private int port = 8821;
private String sendMessage = "Windwos";
public ClientTest() {
try {
if (createConnection()) {
sendMessage();
getMessage();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean createConnection() {
cs = new ClientSocket(ip, port);
try {
cs.CreateConnection();
System.out.print("連接伺服器成功!" + "\n");
return true;
} catch (Exception e) {
System.out.print("連接伺服器失敗!" + "\n");
return false;
}
}
private void sendMessage() {
if (cs == null)
return;
try {
cs.sendMessage(sendMessage);
} catch (Exception e) {
System.out.print("發送消息失敗!" + "\n");
}
}
private void getMessage() {
if (cs == null)
return;
DataInputStream inputStream = null;
try {
inputStream = cs.getMessageStream();
} catch (Exception e) {
System.out.print("接收消息緩存錯誤\n");
return;
}
try {
//本地保存路徑,文件名會自動從伺服器端繼承而來。
String savePath = "E:\\";
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int passedlen = 0;
long len=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(newBufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("文件的長度為:" + len + "\n");
System.out.println("開始接收文件!" + "\n");
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buf);
}
passedlen += read;
if (read == -1) {
break;
}
//下面進度條本為圖形界面的prograssBar做的,這里如果是打文件,可能會重復列印出一些相同的百分比
System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n");
fileOut.write(buf, 0, read);
}
System.out.println("接收完成,文件存為" + savePath + "\n");
fileOut.close();
} catch (Exception e) {
System.out.println("接收消息錯誤" + "\n");
return;
}
}
public static void main(String arg[]) {
new ClientTest();
}
}
⑼ java socket如何實現客戶端與客戶端的交互
1、服務端監聽一個埠,其它客戶端都通過這個埠和服務端進行通信。
2、每個客戶端連接上來,服務端給其一個標識ID。然後向其它所有客戶端廣播一下有新客戶端接入,ID多少。
3、客戶端要向客戶端發送消息,可以以消息包的形式發送,就是把目的客戶端的標識和發送的內容組成一個數據包發往伺服器,伺服器讀取就知道要向哪 個客戶端發送數據,然後把內容往目的客戶端通道發送
⑽ java socket發送數據的類型
在Socket通信中,要在客戶端和服務端中傳輸數據,傳輸的數據有各種類型包括:int,short,long以及版String,甚至是自定義的各種Object,如何能權夠保證在服務端和客戶端之間的數據能夠使得兩端都能理解,這就是所謂的「應用協議「。
在通信的「管道」中,流的都是二進制數據,所以,雙方如何約定好「解析規則」,則就必須要求通信雙方都預先制定好協議。