黑马程序员技术交流社区

标题: TCP网络编程Demo之Socket与ServerSocket [打印本页]

作者: 小罴孩    时间: 2013-7-30 19:44
标题: TCP网络编程Demo之Socket与ServerSocket
/*
演示TCP传输协议

1、TCP分客户端和服务端
2、客户端(Socket),服务端(ServerSocket)
*/

/*
客户端:
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机
因为TCP是面向连接的,所以在建立socket连接时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输

步骤:
1、创建Socket服务,指定要连接的主机端口
2、获取socket流中的输出流
3、发送数据
4、为了显示服务端反馈来的信息,获取socket中的输入流,并打印在控制台
5、关闭socket

*/
import java.io.*;
import java.net.*;

//客户端
class TcpClient
{
        public static void main(String[] args) throws Exception{
                //创建客户端的socket服务,指定目的主机和端口。此时socket流产生,可读可写,
                //socket流里面既有输入流,也有输出流
                Socket s = new Socket("127.0.0.255",9999);
               
                //为发送数据,应该获取socket流中的输出流
                OutputStream out = s.getOutputStream();
                //发送数据
                out.write("服务端,你好~!TCP ge men lai le !".getBytes());
               
                //为接收数据,获取相应的输入流
                InputStream in = s.getInputStream();
                //定义一个缓冲字节数组
                byte[] buf = new byte[1024];
                //数组有效长度,read()为阻塞式的
                int len = in.read(buf);
                System.out.println(new String(buf,0,len));
                s.close();
        }
}

/*
定义端点接收/发送数据

服务端:
1、建立服务端的socket服务,ServerSocket();,监听一个端口
2、获取链接过来的客户端对象通过ServerSocket的accept();,这个方法是阻塞式的
3、客户端如果发过来数据,服务端要使用对应的客户端对象,并获取到该客户端对象的读取流
        来读取发过来的数据
4、读到数据后需要作出相应的反馈,通过从客户端获取输出流OutputStream()来发信息
5、关闭服务端(可选操作)
*/
class TcpServer
{
        public static void main(String[] args) throws Exception{
                //建立服务端socket监听9999端口
                ServerSocket ss = new ServerSocket(9999);

                //获取socket对象,accept();方法是阻塞式的
                Socket s = ss.accept();
               
                //获取IP地址
                String ip = s.getInetAddress().getHostAddress();
                System.out.print(ip+"::");

                //获取客户端发送的数据,使用客户端对象的读取流方法
                InputStream in = s.getInputStream();
                //缓冲数组
                byte[] buf = new byte[1024];
                int len = in.read(buf);//read(byte[])返回的是读取的字节数
                System.out.println(new String(buf,0,len));

                //为了回馈给客户端信息,从客户端获取输出流
                OutputStream out = s.getOutputStream();
                //接收到消息,2秒后再回馈给客户端
                Thread.sleep(2000);
                out.write("收到,客户端,你也好!".getBytes());
                s.close();        //关闭客户端
                //ss.close(); //关闭服务端
        }
}

作者: 小罴孩    时间: 2013-7-30 23:46
{:soso_e140:}
作者: 老冯kk    时间: 2013-8-7 23:46
小罴孩 发表于 2013-7-30 23:46

4.0以后的版本套接字的操作不是不能放在主线程中么?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2