一,了解之前先了解一下网络基础

首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程

一般的网络编程都称为Socket编程,Socket的英文意思是“插座”

网络编程的目的:直接或者间接的通过网络协议与其他计算机进行通信。

网络编程中有两个主要的问题:

-->如何准确定为网络上一台或者多台主机:IP和端口号

-->找到主机后如何可靠搞笑的进行数据传输:Tcp/Ip 协议(四层)

二,网络通信要素

网络通信要素1:IP地址,通过Ip,可以唯一的定为互联网上的一台主机

    ip地址唯一定为一台主机,而端口号定为主机上的某一个正在运行的软件

通讯要素2:网络通信协议TCP/IP协议

三,TCP编程案例1:客户端给服务端发消息,服务端输出此消息到控制台

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str+"\n");
System.out.println("收到来自"+st.getInetAddress().getHostAddress()+"的请求并已回应");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

TCP编程案例2:客户端给服务端发消息,服务端输出此消息到控制台,同时发送已收到信息给客户端

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
InputStream is = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
//声明给服务端发送的东西完毕
socket.shutdownOutput();
//接收服务端的回应
is = socket.getInputStream();
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
OutputStream outputStream = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
// if(st.isInputShutdown()) {
//给予客户端回应
outputStream = st.getOutputStream();
outputStream.write("我已经收到,这是给你(客户端)的回应哦".getBytes());
// }
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

一般关流的时候,遵循从后往前的顺序。

案例3:从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 16:21
*/
//从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接
//注意:本案例中的关流等操作都应该使用try...catch...finally 而不能使用throws Exception 本案例只是为书写方便~

public class socketTomcat {
//客户端
@Test
public void client() throws Exception{
//
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9898);
//
OutputStream outputStream = socket.getOutputStream();
FileInputStream file = new FileInputStream(new File("1.jpg"));
byte[] b = new byte[1024];
int len ;
while((len = file.read(b)) != -1){
outputStream.write(b,0,len);
}
//
socket.shutdownOutput();
//
InputStream inputStream = socket.getInputStream();
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
String str = new String(b1,0,len1);
System.out.println(str);
}
inputStream.close();
outputStream.close();
file.close();
} @Test
public void server() throws Exception{
ServerSocket serverSocket = new ServerSocket(9898);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream file = new FileOutputStream("3.jpg");
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
file.write(b1,0,len1);
} OutputStream outputStream = socket.getOutputStream();
outputStream.write(("来自"+socket.getInetAddress().getHostAddress()+"的图片接收成功").getBytes()); outputStream.close();
file.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}

java之网络编程1-Tcp的更多相关文章

  1. Java:网络编程值TCP的使用

    演示TCP传输   1.Tcp分客户端和服务端 2.客服端对应的对象是scoket    服务端对应的对象是serverscoket   客户端: 通过查阅scoket对象,发现在建立对象时,就可以连 ...

  2. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  3. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  4. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  6. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  7. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  8. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  9. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  10. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

随机推荐

  1. 避免nullpointer 空指针

    来自知乎: 一般在服务器返回的数据上我们会做数据合法性检测,所以在api文档上需要注明字段的取值范围,然后客户端根据这个去做数据检测,缺段就直接走数据错误的流程,这个很大程度上避免了不少nullpoi ...

  2. 动态路由 - OSPF 一文详解

    动态路由 在之前的文章中,介绍了基于距离矢量的路由协议.而在今天这这一部分中会主要讲解链路状态的路由协议,对于动态的路由协议来说,需要具备如下的能力: 发现远端网络 路由器可以直接获得直连路由,这是由 ...

  3. Java 根据两个经纬度,得到两点距离

    private static final double EARTH_RADIUS = 6371000;//赤道半径(单位m)private static final double INTEGR_NUM ...

  4. jzoj1497. 景点中心

    Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个景点均有若干学生正在参观.这n个景点以自然数1至n编号, ...

  5. time模块:时间戳和格式化好的时间表示方法及互相转换方法

    1.导入time模块   import time 2.获取当前时间的时间戳   time.time() 3.获取当前格式化好的时间   time.strftime(想要获取的格式) 4.时间戳和格式化 ...

  6. [LeetCode]15. 三数之和(数组)(双指针)

    题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  7. mysql主从模式部署

    1.下载tar.gz格式的安装包 下载地址https://dev.mysql.com/downloads/mysql/ 2.解压 tar -zvxf mysql-5.7.19-linux-glibc2 ...

  8. 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!

    写在前面 在 [冰河技术] 微信公众号中的[Nginx]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了, 但就是 ...

  9. php Zookeeper使用踩坑

    用的是Zookeeper扩展,Php版本为7.2.17,下载地址: https://pecl.php.net/package/zookeeper 用的是0.6.4版本 创建节点官方给的示例如下: &l ...

  10. Boolean.valueOf(String)

    Boolean.valueOf(String) a. 当 String 的参数值在不区分大小写的时候等于 "true" ,则 Boolean.valueOf(String) 返回值 ...