一、简单的demo

(1)客户端

package com.songyan.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class Demo_Client {
/**
* 1.客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//创建socket
Socket socket=new Socket("127.0.0.1",12345);
//创建输入流
InputStream in=socket.getInputStream();
//创建输出流
OutputStream out=socket.getOutputStream(); //接受服务器返回的数据
byte[] respo=new byte[1024];
int len =in.read(respo);
System.out.println(new String(respo,0,len)); out.write("学习计算机哪家强".getBytes());
} }

(2)服务器端

package com.songyan.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo_server {
/*2.服务端
* com/songyan/tcp/Demo_server.java
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流*/ public static void main(String[] args) throws IOException {
//创建socket
ServerSocket serversocket=new ServerSocket(12345);
//接受客户端的请求
Socket socket=serversocket.accept();
//获取输入流
InputStream in=socket.getInputStream();
OutputStream out =socket.getOutputStream();
//服务器向客户端写数据
out.write("百度一下你就知道".getBytes()); //服务器读取客户端发送的请求
byte[] respo=new byte[1024];
int len =in.read(respo);
System.out.println(new String(respo,0,len));
}
}

(3)运行

在bin目录下(按住shift右键----在此处打开命令行窗口)

输入start打开另一个窗口

在其中一个窗口,先运行服务器端的程序

在另一个窗口运行客户端的程序

二、TCP代码优化(输入字符串/一行)

(1)客户端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class Demo2_Client {
/**
* 1.客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//创建socket
Socket socket=new Socket("127.0.0.1",12345);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//接受服务器返回的数据
System.out.println(br.readLine());
ps.println("我想报名");
System.out.println(br.readLine()); } }

(2)服务器端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo2_server {
/*2.服务端
* com/songyan/tcp/Demo_server.java
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流*/ public static void main(String[] args) throws IOException {
//创建socket
ServerSocket serversocket=new ServerSocket(12345);
//接受客户端的请求
Socket socket=serversocket.accept();
//获取输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//服务器向客户端写数据
ps.println("欢迎访问黑马程序员");
System.out.println(br.readLine());
ps.println("爆满了"); }
}

三、服务端是多线程的

多线程的时候只需要修改服务器端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo3_server {
/*2.服务端
* com/songyan/tcp/Demo_server.java
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流*/public static void main(String[] args) throws IOException {
//创建socket
ServerSocket serversocket=new ServerSocket(12345);
while(true)
{
final Socket socket=serversocket.accept();
new Thread(){
public void run(){
try {
//接受客户端的请求 //获取输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//服务器向客户端写数据
ps.println("欢迎访问黑马程序员");
System.out.println(br.readLine());
ps.println("爆满了");
} catch (IOException e) {
e.printStackTrace();
}
} }.start();
}
}
}

练习题1, 客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串

(1)客户端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner; public class Demo5_Client {
public static String reversel(String str){
return new StringBuffer(str).reverse().toString();
}
/*客户端向服务器写字符串(键盘录入)*/
public static void main(String[] args) throws IOException {
//创建Socket
Socket socket=new Socket("127.0.0.1",12346);
//获取输入流,输出流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//接受服务器的数据
String message=br.readLine();
System.out.println(reversel(message));
//再次向客户端发送数据
Scanner in=new Scanner(System.in);
ps.println(in.nextLine());
message=br.readLine();
System.out.println(reversel(message));
ps.println(in.nextLine()); }
}

(2)服务器端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Demo5_server {
/*服务器(多线程)将字符串反转后写回,
* 客户端再次读取到是反转后的字符串*/
public static void main(String[] args) throws IOException {
//创建服务器端socket
ServerSocket serverSocket=new ServerSocket(12346);
//获取客户端的输入
final Socket socket=serverSocket.accept();
new Thread(){
public void run()
{
//获取输入流对象,输出流对象
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//输出数据给客户端
Scanner in=new Scanner(System.in);
ps.println(in.nextLine());
System.out.println(br.readLine());
ps.println(in.nextLine());
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
} }.start(); }
}

练习题2, 客户端向服务器上传文件

(1)客户端

package com.songyan.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; import javax.xml.ws.handler.MessageContext.Scope; public class Demo1_Client {
public static File getFile()
{
System.out.println("请输入文件路径");
Scanner sc=new Scanner(System.in);
String path=sc.nextLine(); //获取文件路径
File file=new File(path); //文件名封装成文件
while(true)
{
if(!file.exists())
{
System.out.println("文件不存在,请重新输入");
}else if(file.isDirectory())
{
System.out.println("您输入的是文件夹名称,请输入文件名称");
}else{
return file;
}
}
}
public static void main(String[] args) throws UnknownHostException, IOException {
//提示输入上传的文件路径,判断路径是否存在,是否是文件夹
File file=getFile();
//发送文件名到服务端
Socket socket=new Socket("127.0.0.1",12345);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
ps.println(file.getName());
//接受结果
String result=br.readLine();
//如果存在,给予提示,程序直接退出
if("存在".equals(result))
{
System.out.println("文件已存在");
socket.close();
return;
}else{
//如果不存在,定义FileInputStream读取文件,写出到网络
FileInputStream fileIn=new FileInputStream(file);
byte[] arr=new byte[8192];
int len;
while((len=fileIn.read(arr)) != -1)
{
ps.write(arr,0,len);
}
fileIn.close();
socket.close(); } }
}

(2)服务器端

package com.songyan.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo1_Server {
public static void main(String[] args) throws IOException {
//建立多线程服务器
ServerSocket server=new ServerSocket(12345);
//读取文件名
while(true)
{
final Socket socket= server.accept();
new Thread(){
public void run()
{
try {
InputStream in= socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
PrintStream ps=new PrintStream(socket.getOutputStream());
String filename=br.readLine();
//判断文件是否存在,结果返回给客户端
File dir=new File("path");
dir.mkdir();
File file=new File(dir,filename);
if(file.exists())
{
ps.println("存在");
socket.close();
return;
}else{
ps.println("不存在");
}
//定义FileOutputStream,从网络读取数据存储到本地
FileOutputStream out=new FileOutputStream(file);
byte[] arr= new byte[8192];
int len ;
while((len=in.read(arr))==-1)
{
out.write(arr,0,len);
}
out.close();
socket.close(); } catch (IOException e) {
e.printStackTrace();
} } }.start(); }
}

运行后在项目的根路径下就会创建path文件夹,文件夹中就会包括上传的文件(这里这个文件夹就是模拟的服务器中的文件夹)

网络编程-tcp的更多相关文章

  1. GO语言练习:网络编程 TCP 示例

    1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...

  2. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  3. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  4. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  5. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  6. Socket网络编程-TCP编程

    Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...

  7. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  8. 网络编程TCP/IP详解

    网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...

  9. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  10. 网络编程TCP/IP实现客户端与客户端聊天

    一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/I ...

随机推荐

  1. Lucene4.6查询时完全跳过打分,提高查询效率的实现方式

    由于索引的文件量比较大,而且应用中不需要对文档进行打分,只需要查询出所有满足条件的文档.所以需要跳过打分来提高查询效率.一开始想用ConstantScoreQuery,但是测试发现这个类虽然让所有返回 ...

  2. Intelij idea新窗口打开项目设置

    1.idea 打开后 file->setting   2.appearance&behave->system setting->open project in new win ...

  3. 在liberty中通过LTPA设置单点登录

    不要忘了下面的设置,参考: https://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp. ...

  4. 【BZOJ4766】文艺计算姬 [暴力]

    文艺计算姬 Time Limit: 1 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description "奋战三星期,造台计算机 ...

  5. html5 游戏开发

    近来想做html5游戏开发些小东西玩一下,因为手边就是笔记本,想怎么玩就怎么玩了,今年可以说是非常重要特殊的一年,感觉有些倒霉,不过,心态最重要,该怎么做的时候就去怎么做吧,日子的24小时是不会变的, ...

  6. bzoj 2064 DP

    这道题可以抽象成两个数列,将一个数列变换为另一个 数列的代价最小 首先我们可以处理出所有的状态代表,对于每个状态 用二进制来表示,代表的是两个数列中的每一项选还是不选 那么答案最多为n1+n2-2,也 ...

  7. mongoDB文档操作【增删改】

    MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 Mo ...

  8. elastaticsearch

    # https://elasticsearch-dsl.readthedocs.io/en/latest/ # 文档:https://es.xiaoleilu.com/054_Query_DSL/70 ...

  9. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...

  10. vue指令v-bind

    v-bind用于绑定 html 属性,通常会将v-bind缩写(如"v-bind:class"可缩写成":class"): v-bind除了可以绑定字符串类型变 ...