套接字通信(TCP)
Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。
玩socket通信要一台手机,建立一个app工程(作为客户端),一个普通java工程(作为服务端)
=====================================================================================================================================================
服务端代码:
public class socketSer { public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket serverSocket = null; try { // 创建一个ServerSocket对象,并让这个Socket在1989端口监听 serverSocket = new ServerSocket(1989); // 调用ServerSocket的accept()方法,接受客户端所发送的请求, // 如果客户端没有发送数据,那么该线程就停滞不继续 Socket socket = serverSocket.accept(); // 从Socket当中得到InputStream对象 InputStream inputStream = socket.getInputStream(); byte buffer[] = new byte[1024 * 4]; int temp = 0; // 从InputStream当中读取客户端所发送的数据 while ((temp = inputStream.read(buffer)) != -1) { System.out.println(new String(buffer, 0, temp)); } serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
1、监听一个端口
2、堵塞在accept方法中,直到有数据传送
3、将socket的输入流显示出来
4、服务器端要创建的是ServerSocket
================================================================================================================================================================
服务端activity:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void getButton(View v) { new socketThread().start();//建立socket连接这种耗时操作要在子线程中进行 } } class socketThread extends Thread{ public void run(){ try { //对ip为192.168.1.104的1989端口建立socket连接 Socket socket=new Socket("192.168.1.104", 1989); //在连接的基础上得到输出流 OutputStream out = socket.getOutputStream(); String info="asdfghjkl"; //将字符串转换成byte数组 byte[] buffer=info.getBytes(); //信息写入输出流 out.write(buffer); //传送出去 out.flush(); System.out.println("发送成功"); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
1、布局只有一个按钮,点击即刻发送信息
2、因socket通信时连接网络的耗时操作,所以必须在子线程中运行,否则虚拟机挂掉
3、与一个ip地址的一个端口建立socket通信,再用输出流送出去