今天做了一个不同语言之间 C/S 的socket通讯实验, 还是发现了在不同语言间的问题. :)
服务器端
package p1;
import java.io.IOException;
import java.net.ServerSocket;
public class C1 {
private ServerSocket ss;
public C1() {
try {
int i = 0;
ss = new ServerSocket(10000);
while (true) {
i++;
T t = new T(ss.accept(), i);
Thread tt = new Thread(t);
tt.start();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(ss != null){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new C1();
}
}
package p1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class T implements Runnable {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private int i = 0;
public T(Socket socket, int i){
this.socket = socket;
this.i = i;
}
@Override
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
in.readLine();
System.out.println(i + " Server Socket sleep 1 sec");
Thread.sleep(1000);
out = new PrintWriter(socket.getOutputStream());
out.write("this is " + i + " echo ");
out.flush();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public Socket getSocket() {
return socket;
}
}
客户端: (注意send时, 后面要显示加一个 \r 来告诉java的socket:"数据发送完毕", 否则会一直在in.readLine()等待)
import time
class timer(threading.Thread):
def __init__(self, i):
threading.Thread.__init__(self)
self.i = i
def run(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('192.168.2.49', 10000))
print "connected";
sock.send(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + "\r")
print "send data...";
sock.recv(1024);
print "recv data...";
sock.close()
def test():
n = int(raw_input("please input loop count"));
for i in range(1, n + 1):
t1=timer(i)
t1.start()
if __name__=='__main__':
test()