Socket编程

来源:互联网 发布:并行计算编程 编辑:程序博客网 时间:2024/05/22 02:21

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 stubtry {//创建一个Socket对象,指定服务端的IP地址和端口Socket socket=new Socket("192,168,1,104",4567);//使用InputStream读取硬盘上的文件InputStream inputStream=new FileInputStream("D://test.txt");//从Socket当中得到OutputStreamOutputStream 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() {@Overridepublic 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();}}    }}