今天学习了Socket通信,特来此留贴一份以作纪念,废话不多说,直接进入主题:
一个Socket通信的完成,需要客户端和服务器端的配合,这个配合就好比,两个人在电话中聊天,当甲拨出号码,乙在另一头接起电话时,他们直接就已经搭建了一个沟通的桥梁,对于客户端和服务器端是一样的。客户端通过Socket向指定ip地址的某端口发出数据通信请求,而服务器端此时也正在(违禁词语-已隐藏)该端口的情况,也就是说,对于指定的ip地址和端口号我们完全可以认为是甲乙电话通讯时的电话号码。
Socket通信分为两种一个是UDP,一个是TCP,UDP的好处是:速度快,但是缺点是此协议只管发送数据,并不管对方是否接收到数据,而TCP每次发出数据后都要等待对方传回数据做以肯定,然后再发送下一部分数据。但是速度不如UDP快。
下面是我做的实例中的部分代码:
第一部分:我利用swing写了一个服务器端,用于(违禁词语-已隐藏)接收客户端发送来的数据,具体的界面和代码如下所示:
-
public class SocketService extends JFrame {
-
private JTextField nameTxt=null;
-
String id="";
-
public SocketService(){
-
-
this.init();
-
}
-
public void init(){
-
this.setTitle("Tcp服务器端");
-
this.setBounds(100,100,400,250);
-
this.createUI();
-
//this.setVisible(true);
-
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
-
}
-
-
public void createUI(){
-
JPanel panel=new JPanel();
-
//添加边框
-
Border border=BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
-
TitledBorder tBorder=BorderFactory.createTitledBorder(border,"校验面板",TitledBorder.CENTER,TitledBorder.TOP);
-
panel.setBorder(tBorder);
-
panel.setLayout(null);
-
this.add(panel);
-
//网卡地址
-
JLabel nameLbl=new JLabel("接收客户端数据:");
-
nameLbl.setBounds(10,30,140,25);
-
panel.add(nameLbl);
-
nameTxt=new JTextField();
-
nameTxt.setBounds(130,30,230,22);
-
panel.add(nameTxt);
-
-
-
//按钮
-
JButton btn=new JButton("开启TCP服务");
-
btn.setBounds(40,160,140,22);
-
panel.add(btn);
-
-
-
btn.addActionListener(new ActionListener(){
-
public void actionPerformed(ActionEvent arg0){
-
nameTxt.setText("");
-
new TCPThread().start();
-
}
-
});
-
-
-
JButton btn2=new JButton("开启UDP服务");
-
btn2.setBounds(220, 160, 140, 22);
-
panel.add(btn2);
-
btn2.addActionListener(new ActionListener(){
-
public void actionPerformed(ActionEvent arg0){
-
nameTxt.setText("");
-
new UDPThread().start();
-
-
}
-
});
-
-
}
-
//Tcp传输的操作过程
-
class TCPThread extends Thread{
-
-
public void run(){
-
try {
-
while(true){
-
ServerSocket tcpSocket=null;
-
tcpSocket=new ServerSocket(4567);
-
Socket s=null;
-
s=tcpSocket.accept();//如果未收到数据,此句不会继续向下执行,一直处于(违禁词语-已隐藏)状态
-
InputStream in=s.getInputStream();
-
byte[] buffer=new byte[1024*4];
-
int temp=0;
-
while((temp=in.read(buffer))!=-1){
-
nameTxt.setText(new String(buffer,0,temp));
-
}
-
s.close();
-
tcpSocket.close();
-
-
-
}
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
-
-
}
-
-
}
-
//UDP传输的操作过程
-
class UDPThread extends Thread{
-
-
public void run(){
-
try {
-
DatagramSocket d=new DatagramSocket(5678);
-
byte[] data=new byte[1024];
-
DatagramPacket packer=new DatagramPacket(data, data.length);
-
try {
-
d.receive(packer);//如果未收到数据,此句不会继续向下执行,一直处于(违禁词语-已隐藏)状态
-
System.out.println(packer.getLength());
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
} catch (SocketException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
-
-
}
-
-
- }
复制代码
第二部分:客户端是利用android平台,具体的界面和他代码如下所示:
-
public class SocketClient extends Activity {
-
/** Called when the activity is first created. */
-
TextView tv = null;
-
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
Button tcpbtn = (Button) this.findViewById(R.string.Id1);
-
Button udpbtn = (Button) this.findViewById(R.string.Id2);
-
tv = (TextView) this.findViewById(R.string.text1);
-
-
-
//tcp通信过程
-
tcpbtn.setOnClickListener(new OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
try {
-
Socket s = new Socket("192.168.0.115", 4567);//创建一个socket对象,绑定要通信的服务器端Ip和端口
-
OutputStream out = s.getOutputStream();//将要传递的数据进行字节数组处理,然后以输出流的形式发送出去
-
out.write(tv.getText().toString().getBytes());
-
out.flush();
-
} catch (UnknownHostException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
-
}
-
-
});
-
-
//udp通信过程
-
udpbtn.setOnClickListener(new OnClickListener(){
-
-
@Override
-
public void onClick(View v) {
-
// TODO Auto-generated method stub
-
try {
-
DatagramSocket ds=new DatagramSocket(5678);
-
InetAddress serverAddr= InetAddress.getByName("192.168.0.115");//绑定要通信的服务器端IP
-
byte[] data=tv.getText().toString().getBytes();
-
DatagramPacket packet=new DatagramPacket(data,data.length,serverAddr,5678);
-
ds.send(packet);
-
} catch (Exception e) {
-
// TODO Aut
-
o-generated catch block
-
e.printStackTrace();
-
}
-
}
-
-
-
-
});
-
}
- }
复制代码
经过测试在服务器端,如下图所示,可以接收到客户端发送过来的数据为:“hello”