我有不同的IP地址與不同的端口號連接到不同系統的套接字數量。我的問題是我必須在任何系統中運行一個程序來一次傳送所有套接字,並且如何從套接字中並行傳送消息?如何在java中通信多個套接字?
雖然我使用單個套接字,它將正常工作,我從超級終端不斷地收到消息。不止一個連接,然後我得到的第一個反應只..所以請提供解決方案儘快
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import com.ibatis.sqlmap.client.SqlMapClient;
public class Client1 extends Thread {
static Socket socket;
static Socket socket1;
static String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
static SqlMapClient sqlMap=GetDBConnection.sqlMap;
static BufferedReader br = null;
static DataOutputStream dos=null;
static BufferedReader br1 = null;
static DataOutputStream dos1=null;
public static void main(String args[]){
try{
String host="192.168.1.151";
int port=5002;
String host1="192.168.1.150";
int port1=5001;
socket = new Socket(host, port);
socket1=new Socket(host1, port1);
dos = new DataOutputStream(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
dos1 = new DataOutputStream(socket1.getOutputStream());
br1 = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
Thread t = new Thread(new Runnable() {
public void run() {
while(socket.isConnected()) {
try{
HashMap map = new HashMap();
String str = br.readLine();
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
String time = sdf.format(cal.getTime());
map.put("data", str);
map.put("port", socket.getPort());
map.put("date_time", time);
sqlMap.insert("insert", map);
}
catch(Exception e){
e.printStackTrace();
}
}
}
});
Thread t1 = new Thread(new Runnable() {
public void run() {
while(socket1.isConnected()) {
try{
HashMap map = new HashMap();
String str = br1.readLine();
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
String time = sdf.format(cal.getTime());
map.put("data", str);
map.put("port", socket1.getPort());
map.put("date_time", time);
sqlMap.insert("insert", map);
}
catch(Exception e){
e.printStackTrace();
}
}
}
});
t.start();
t1.start();
}
catch(Exception e){
e.printStackTrace();
}
}
}
我運行兩個線程的兩個插槽的做工精細,但如果我有100座那我該怎麼做呢?我無法創建線程100的...所以提供最佳解決方案..
public class Client implements Runnable{
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
static BufferedReader br = null;
static DataOutputStream dos=null;
static Socket socket = null;
SqlMapClient sqlMap=GetDBConnection.sqlMap;
Client(String host, int port)
{
try {
socket = new Socket(host, port);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run()
{
try {
HashMap map = new HashMap(5);
String str;
int prt=socket.getPort();
dos = new DataOutputStream(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while((str=br.readLine())!=null)
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
String time = sdf.format(cal.getTime());
map.put("data", str);
map.put("port",prt);
map.put("date_time", time);
sqlMap.insert("insert", map);
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try {
socket.close();
dos.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[])
{
ResultSet rs=null;
Connection con = null;
try {
Class.forName("org.postgresql.Driver");
con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Socket","username","passwd");
Statement st=con.createStatement();
String vsql="select port, ip_addr from port_instrument";
rs=st.executeQuery(vsql);
while (rs.next()) {
String id = rs.getString(1);
String ipaddr = rs.getString(2);
new Thread(new Client(ipaddr, Integer.parseInt(id))).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally{
try {
con.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
通過使用此代碼,我們可以只用單插槽通信。在我的數據庫中,我有5個套接字,但最終我只從最後一個套接字(5)獲得通信。
使用線程並行處理一個開始。 – Codemwnci 2011-01-05 09:28:02
可以請提供一個例子... – pmad 2011-01-05 09:52:40