1.什么是Socket
a. Socket的英文原意是"插座"
b. 所谓Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄
c. 应用程序通常通过"套接字"向网络发送请求或者应答网络请求
2.Socket基本通讯模型
3.使用基于TCP协议的Socket
4.使用基于UPD协议的Socket
5.编写程序
a.创建两个项目Client,Socket
b.Client项目有两个文件TCPClient.java,UDPClient.java
TCPClient.java中的代码如下:
package wei.cao.test; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class TCPClient { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { //创建一个Socket对象,指定服务端的IP地址和端口 Socket socket=new Socket("192,168,1,104",4567); //使用InputStream读取硬盘上的文件 InputStream inputStream=new FileInputStream("D://test.txt"); //从Socket当中得到OutputStream OutputStream outputStream=socket.getOutputStream(); byte buffer[]=new byte[4*1024]; int temp=0; //将inputStream当中的数据取出,并写入到outputStream当中 while((temp=inputStream.read(buffer))!=-1) { outputStream.write(buffer); } outputStream.flush(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
UDPClient.java中的代码如下:
package wei.cao.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPClient { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { //首先创建一个DatagramSocket对象 DatagramSocket socket=new DatagramSocket(4567); try { //创建InetAddress对象 InetAddress serverAddress=InetAddress.getByName("192.168.1.104"); String str="Hello"; byte data[]=str.getBytes(); //创建一个DatagramPacket对象,并指定要讲这个 数据包发送到网络当中的哪个地址,以及端口号 DatagramPacket packet=new DatagramPacket(data,data.length,serverAddress,4567); try { //调用Socket对象的send方法,发送数据 socket.send(packet); } catch (IOException e) { e.printStackTrace(); } } catch (UnknownHostException e) { e.printStackTrace(); } } catch (SocketException e) { e.printStackTrace(); } } }
c.Socket项目中有一个SocketActivity.java文件,代码如下
package wei.cao.test; import java.io.IOException; import java.io.InputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class SocketActivity extends Activity { /** Called when the activity is first created. */ private Button btnStartSocket; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStartSocket=(Button)this.findViewById(R.id.btnStartSocket); btnStartSocket.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { new ServerThread().start(); } }); } class ServerThread extends Thread { //基于TCP的 public void run() { //声明一个ServerSocket对象 ServerSocket serverSocket=null; try { //创建一个ServerSocket对象,并让Socket在4567端口监听 serverSocket=new ServerSocket(4567); //调用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.print(new String(buffer,0,temp)); } } catch (IOException e) { e.printStackTrace(); } finally { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } //基于UDP的 public void run2() { try { //创建一个DatagramSocket对象,并指定监听的端口号 DatagramSocket socket=new DatagramSocket(4567); byte data[]=new byte[1024]; //创建一个空的DatagramPacket对象 DatagramPacket packet=new DatagramPacket(data,data.length); try { //用receive方法接收客户端所发送 的数据 socket.receive(packet); System.out.println(packet.getLength()); } catch (IOException e) { e.printStackTrace(); } } catch (SocketException e) { e.printStackTrace(); } } } }