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();
}
}
}
}