Ⅰ java socket實現兩個客戶段或多個客戶端之間通信,該怎麼解決
javasocket有兩種方式。一種是UDP這個可以直連,不需要伺服器。一種是TCP這個是肯定要能過伺服器來通信的。所以你說的。鏈接建立完畢後不再通過伺服器!這個可以實現,但會麻煩一些。1.先說一下簡單的點的吧。用TCP的方式。你所有的消息都是發給伺服器。包含你的IP及通信埠,及對方的IP及通信埠信息。當然這些是隱藏在數據報中的。這樣由伺服器來進行分發。2.你說的那種方式有點類似TCP與UDP混合。首先啟動一個SERVER然後每一個客戶端,先要登陸SERVER,並在server上記錄下你的IP及通信埠信息,如果你要連接某一個客戶端。先要向伺服器發出一個申請,獲得到方的IP及埠信息,然後進行UDP連接。連接上以後,就是直接發送息,不需要伺服器了。javasocket的東西,以前做過一些,所以有思路,但沒有現成的代碼。有問題再聯系。
Ⅱ linux用java socket與c的socket通信亂碼問題
應該就是字元集問題。
首先要確定Linux返回的數據中,採用了那種編碼方式,如:GBK。
對應的,在Java一端,將字元串信息轉換成byte數組並寫入Socket,讀出的數據也轉換成字元串,
如:
String s = "中文" ;
sockoutputstream.write (s.getBytes ("GBK")) ;
讀出來時候,
byte [] buf = sockinputStream.read ()
String s = new String (buf, "GBK") ;
這樣就可以了。
Ⅲ java中的socket是什麼意思
所謂socket通常也稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄。應用程序通常通過"套接字"向網路發出請求或者應答網路請求。
以J2SDK-1.3為例,Socket和ServerSocket類庫位於java.net包中。ServerSocket用於伺服器端,Socket是建立網路連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對於一個網路連接來說,套接字是平等的,並沒有差別,不因為在伺服器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。
重要的Socket API:
java.net.Socket繼承於java.lang.Object,有八個構造器,其方法並不多,下面介紹使用最頻繁的三個方法,其它方法大家可以見JDK-1.3文檔。
. Accept方法用於產生"阻塞",直到接受到一個連接,並且返回一個客戶端的Socket對象實例。"阻塞"是一個術語,它使程序運行暫時"停留"在這個地方,直到一個會話產生,然後程序繼續;通常"阻塞"是由循環產生的。
. getInputStream方法獲得網路連接輸入,同時返回一個InputStream對象實例。
. getOutputStream方法連接的另一端將得到輸入,同時返回一個OutputStream對象實例。
注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,因為它們返回的流對象,通常都會被另一個流對象使用。
2ServerSocket類例子編輯
package com.lanber.socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
/**
* 注意:Socket的發送與接收是需要同步進行的,即客戶端發送一條信息,伺服器必需先接收這條信息,
* 而後才可以向客戶端發送信息,否則將會有運行時出錯。
* @param args
*/
public static void main(String[] args) {
ServerSocket ss = null;
try {
ss = new ServerSocket(8888);
//伺服器接收到客戶端的數據後,創建與此客戶端對話的Socket
Socket socket = ss.accept();
//用於向客戶端發送數據的輸出流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//用於接收客戶端發來的數據的輸入流
DataInputStream dis = new DataInputStream(socket.getInputStream());
System.out.println("伺服器接收到客戶端的連接請求:" + dis.readUTF());
//伺服器向客戶端發送連接成功確認信息
dos.writeUTF("接受連接請求,連接成功!");
//不需要繼續使用此連接時,關閉連接
socket.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3客戶端的例子編輯
package com.lanber.socket;
importjava.io.DataInputStream;
import java.io.DataOutputStream;
importjava.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
/**
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost",8888);
//獲取輸出流,用於客戶端向伺服器端發送數據
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//獲取輸入流,用於接收伺服器端發送來的數據
DataInputStream dis = new DataInputStream(socket.getInputStream());
//客戶端向伺服器端發送數據
dos.writeUTF("我是客戶端,請求連接!");
//列印出從伺服器端接收到的數據
System.out.println(dis.readUTF());
//不需要繼續使用此連接時,記得關閉哦
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ⅳ java socket 伺服器端如何根據客戶端輸入實現對資料庫的增刪改查求實例,謝謝大家了!
寫一個操作的協議
如添加的時候,使用
add;customer;張三;4404111111111111111111;2014-04-09;200
伺服器接收到解析字元串,再使用相應的操作
Ⅳ java中Socket通信
你加了高分我才貼
----------------具體是: Client-A發送消息向Server:消息包括內容+流向(Client-B的地址)+消息來源地址 Server接收後再把消息+來源地址發給Client-B
Ⅵ java socket有什麼用
socket是用於網路通信的,你想要跟別人聯系都得通過socket占據埠來與別人通信,比如QQ的聊天,就是用socket來發送消息的
Ⅶ C++用socket 做服務端,Java做客戶端 可以通信嗎
可以通信的,因為C++和JAVA都是使用SOCKET編程,因此C++寫的伺服器,JAVA做客戶端是能夠通信的。我也經常使用python搭建一個伺服器,因為PYTHON提供了SOCKET庫,這個庫跨平台也很好用。我的同事在寫溫濕度監控的後台伺服器(java),就是連接到我用python寫的伺服器進行測試的。
如果說你的通信不上,那麼先要檢測,能否互相ping通,其次搞清楚C++伺服器在區域網還是外網,如果是自己搭的伺服器還需要考慮這個埠映射問題。如果這些都沒問題就是通信不上,你就要通過wireshark等抓包工具查一下TCP/IP的三次握手了。一般來說,調用socket的API時系統都會通過返回值告訴你實際連接上沒有,如果是通信不上,多半是通信協議這一塊沒做好。
如果有不懂的,歡迎進一步提問
Ⅷ 如何用把Socket接受來的數據插入到資料庫中java
java資料庫編程要用JDBC
JDBC用法很簡單,創建一個以JDBC連接資料庫的程序,包含7個步驟:
1、載入JDBC驅動程序:
在連接資料庫之前,首先要載入想要連接的資料庫的驅動到JVM(Java虛擬機),
這通過java.lang.Class類的靜態方法forName(String className)實現。
例如:
try{
//載入MySql的驅動類
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驅動程序類 ,載入驅動失敗!");
e.printStackTrace() ;
}
成功載入後,會將Driver類的實例注冊到DriverManager類中。
2、提供JDBC連接的URL
•連接URL定義了連接資料庫時的協議、子協議、數據源標識。
•書寫形式:協議:子協議:數據源標識
協議:在JDBC中總是以jdbc開始
子協議:是橋連接的驅動程序或是資料庫管理系統名稱。
數據源標識:標記找到資料庫來源的地址與連接埠。
例如:(MySql的連接URL)
jdbc:mysql:
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字元集。如果characterEncoding設置為
gb2312或GBK,本參數必須設置為true 。characterEncoding=gbk:字元編碼方式。
3、創建資料庫的連接
•要連接資料庫,需要向java.sql.DriverManager請求並獲得Connection對象,
該對象就代表一個資料庫的連接。
•使用DriverManager的getConnectin(String url , String username ,
String password )方法傳入指定的欲連接的資料庫的路徑、資料庫的用戶名和
密碼來獲得。
例如:
//連接MySql資料庫,用戶名和密碼都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("資料庫連接失敗!");
se.printStackTrace() ;
}
4、創建一個Statement
•要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3
種類型:
1、執行靜態SQL語句。通常通過Statement實例實現。
2、執行動態SQL語句。通常通過PreparedStatement實例實現。
3、執行資料庫存儲過程。通常通過CallableStatement實例實現。
具體的實現方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt =
con.prepareCall("{CALL demoSp(? , ?)}") ;
5、執行SQL語句
Statement介面提供了三種執行SQL語句的方法:executeQuery 、executeUpdate
和execute
1、ResultSet executeQuery(String sqlString):執行查詢資料庫的SQL語句
,返回一個結果集(ResultSet)對象。
2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或
DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的
語句。
具體實現的代碼:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
6、處理結果
兩種情況:
1、執行更新返回的是本次操作影響到的記錄數。
2、執行查詢返回的結果是一個ResultSet對象。
• ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些
行中數據的訪問。
• 使用結果集(ResultSet)對象的訪問方法獲取數據:
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比較高效
}
(列是從左到右編號的,並且從列1開始)
7、關閉JDBC對象
操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲
明順序相反:
1、關閉記錄集
2、關閉聲明
3、關閉連接對象
if(rs != null){ // 關閉記錄集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 關閉聲明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 關閉連接對象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}