您的位置:首页 > 理论基础 > 计算机网络

java之 23天 TCP 网络编程 (二)

2017-03-27 11:24 316 查看
TCP一次传输

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* TCP传输
* Socket 和ServerSocket
* 建立客户端和服务器端
* 建立连接后,通过Socket中的IO流进行数据的传递
* 关闭Socket
* 同样,客户端与服务器端是两个独立的应用程序.
*
* 客户端:
*   通过查阅socke对象,发现在该对象建立的时候,就可以去连接指定的主机.
*   因为tcp是面向连接的,所以在建立socket的服务时,就要有服务端存在,并连接成功.形成通路后,在该通道进行数据的传输.
*
*   步骤
*   1.创建Socket服务,并指定要连接的主机和端口,必须要启动服务器端监听
*   2.然后创建 客户端,然后开始交流
*
* 需求:给服务端发送一个文本数据
*
*/

class TcpClient{
public static void main(String[] args) throws IOException{
Socket s=new Socket("192.168.1.121",10000);

OutputStream out=s.getOutputStream();
out.write("tcp 哥们来了".getBytes());

s.close();

}
}

/**
* 需求:定义端点接受数据并打印在控制台上
* 服务端:
*  1.建立服务器端的socket服务, ServerSocket()
*    并监听一个端口.
*  2. 获取连接过来的客户端对象.
*    通过ServerScoket的accept方法,所以这个方法是阻塞式的
*  3.客户端如果发来数据,那么服务端要使用对应的客户对象,并获取到该客户端对象的读取流读取发过来的数据
*    并打印在控制台.
*  4.关闭服务器  (可选)
*
*
*/
class TcpServer{

public static void main(String[] args) throws IOException{
//建立服务端socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(10000);

Socket s=ss.accept();

String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");

//获取客户端发送过来的额数据,那么要使用客户端对象的读取流来读取数据
InputStream in=s.getInputStream();

byte[] buf=new byte[1024];
int len=in.read(buf);

System.out.println(new String(buf,0,len));//关闭客户端
s.close();
ss.close();
}

}


TCP的传输的客户端和服务端的互访

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 演示 tcp的传输的客户端和服务端的互访
*
* 需求:客户端给服务端发送数据,服务端接手后,给客户端反馈系信息
*
*  客户端:
*  1.建立Socket服务,指定要连接主机和端口
*  2.获取socket流中的输出流,将数据写到该流中,通过网络发送给服务端
*  3.获取socket流中的输入流,将服务端反馈的数据获取到,并打印
*  4.关闭资源
*/

class TcpClient2{
public static void main(String[] args) throws IOException{
Socket s=new Socket("192.168.1.121",10000);

OutputStream out=s.getOutputStream();
out.write("服务端,你好吗?".getBytes());

InputStream in=s.getInputStream();

byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}

class TcpServer2{
public static void main(String[] args) throws IOException{
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();

String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
InputStream in=s.getInputStream();

byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));

OutputStream out=s.getOutputStream();
out.write("我很好,thankyou!".getBytes());

s.close();

ss.close();

}

}


TCP服务端转换客户端文本

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
*
* 需求:建立一个文本转换服务器
* 客户端给服务端发送一个,服务端会将文本转成大写再返回给客户端.
* 而且客户端可以不端的进行文本转换.当客户端输入over时,转换结束.
*
*
* 分析
* 客户端:
*   既然是操作设备上的数据,就可以使用io技术,并按照io的操作规律来思考
*   源:键盘录入
*   目的:网络设备,网络输出流.
*   可以操作的是文本数据,可以选择字符流
*
* 步骤:
* 1.建立服务
* 2.获取键盘录入
* 3.将数据发送给服务端
* 4.获取服务端的的反馈数据
* 5.结束,关资源
* 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲.
*
*
* 该例子出现的问题:
* 现象:客户端和服务端都在莫名的等待.
* 为什么呢?
* 因为客户端和服务端都有阻塞式方式,这些方法么有读取到结束标记,
* 那么就一直等.而导致两端都在等待.
*
*/

class TransClient{

public static void main(String[] args) throws IOException{

Socket s=new Socket("192.168.1.121",10000);
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

//BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//优化
PrintWriter out=new PrintWriter(s.getOutputStream(),true);

BufferedReader bufrs=new BufferedReader(new InputStreamReader(s.getInputStream()));

String line=null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
out.println(line);
/*
bufw.write(line);
bufw.newLine(); //缓冲区的 读取结束标记
bufw.flush();*/

String str=bufrs.readLine();
System.out.println("Server:"+str);
}
bufr.close();
s.close();
}
}

class TransServer{
public static void main(String[] args) throws IOException{
ServerSocket ss=new ServerSocket(10000);

Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//读取socket流中的数据
BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));

//目的Socket输入流,将大写的写入到socket输出流,并发给客户端
//BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

//优化
PrintWriter out=new PrintWriter(s.getOutputStream(),true);

String line=null;
while((line=bufr.readLine())!=null){
System.out.println(line);

out.println(line.toUpperCase());
/*
bufw.write(line.toUpperCase());
bufw.newLine(); //缓冲区的 读取结束标记
bufw.flush();*/
}
s.close();
ss.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: