public class TimeRun extends TimerTask { public void run(){ Calendar cal = Calendar.getInstance(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); String timestamp = formatter.format(cal.getTime());
[2010-07-07 17:29:55,593] TimeRun Test [2010-07-07 17:29:57,593] TimeRun Test [2010-07-07 17:29:59,593] TimeRun Test [2010-07-07 17:30:01,593] TimeRun Test [2010-07-07 17:30:03,593] TimeRun Test [2010-07-07 17:30:05,593] TimeRun Test [2010-07-07 17:30:07,593] TimeRun Test [2010-07-07 17:30:09,593] TimeRun Test [2010-07-07 17:30:11,593] TimeRun Test [2010-07-07 17:30:13,593] TimeRun Test [2010-07-07 17:30:15,593] TimeRun Test
프로젝트도 끝나고 다음 프로젝트까지 어느 정도 여유로운 시간이 생겨서 프로젝트 기간에 부족했던 부분들을 다시 공부하려고 "난 정말 JAVA를 공부한 적이 없다구요" 라는 JAVA서적을 읽게되었습니다. 총 페이지 857PAGE정도의 분량인데 거진 다 읽어 가고 있습니다.
이 책을 읽어 가는 동안에 느낀 점은
"난 정말 JAVA를 공부한 적이 없다구요" 라는 제목 보다는 "난 정말 JAVA를 제대로 공부한 적이 없다구요" 이 더 맞지 않을까 라는 생각이 들더군요.
이 책을 읽으면서... 난 정말 JAVA를 제대로 공부한 적이 없었구나... 라는 생각이 들었습니다.
JAVA를 제대로 공부하고 싶다면 초급 개발자 뿐만 아니라 중급 개발자 분들도 꼭 읽어봤으면 좋을 것 같습니다. 책의 전반적인 내용은 JAVA에 대한 기본적인 내용을 다룬 기본서입니다. 하지만 문법만 다룬 것이 아닙니다. 이 책에는 Why? 와 How? 도 다룹니다.(밑줄 쫙~)
제가 JAVA 기본서를 다시 보려고 했던 이유는 이번 프로젝트를 진행하면서 뭔가가 턱턱 막히는 기분이 들었습니다. 부끄러운 이야기 이지만 기본적인 부분에서 많이 막혔습니다. (문법 이런건 아닙니다 ^___________^) 경험이 부족해서 그렇다고는 생각하지 않습니다. 경험이 많고 적음을 떠나서 기본이 부족하다는 생각을 하게 되었습니다. 그 부족한 부분을 채워주었던 것이 Why와 How였습니다.
즉, 이 책에서는 JAVA에 대한 기본적인 내용도 다루지만 JAVA에 대한 전체적인 "이해"를 도와줍니다.
고급 개발자가 되기 위해서는 기본이 탄탄해야한다고 이야기를 많이 들었을 것입니다. 초급 개발자가 중급 개발자가 개발한 소스를 참고하여 개발을 하는데 "Why"에 대한 이해 없이는 중급 개발자가 될 수 없습니다. 그 "Why"에 대한 이해는 기본에서 부터 시작된다고 생각합니다. 저도 그 "Why"를 이해하려고 노력하고 있습니다.
- "난 정말 JAVA를 공부한 적이 없다구요"
책의 초반부는 JAVA의 기본적인 내용은 변수, 자료형, 형변환, 연산자, 실행 흐름 컨트롤등등 을 다루고 있습니다. JAVA 를 처음 접하시는 분들은 반드시 읽어야 할 부분입니다. 어려운 내용은 아니지만 모르면 아무것도 할 수 없는 내용들이죠.
책 초반부는 거의 속독으로 읽어내려갔습니다. 책의 중반부 부터는 제가 개인적으로 중요하다고 생각하는 내용들은 정독하였습니다. 중 요하기도 하지만 다시 제대로 학습 하고 싶었습니다.
다른 Chapter들이 중요하지 않다라는 것은 아닙니다. 위에서 열거한 것들을 제대로 이해하기 위해서 반드시 나머지 부분들도 읽어봐야합니다.
Chapter 08. 클래스 패스와 패키지
- Chapter 제목과 같이 클래스 패스와 패키지에 대한 설명입니다. java classpath를 환경 변수에 설정하는 이유는 다들 아실 것입니다. 누군가 Why? 해야하나요?? 라고 물으신다면 다들 대답하실 수 있으실 것이라고 생각합니다. 하 지만 java.exe가 어떻게(How) class들을 찾는지 물어본다면 대답하실 수 있으신가요? 그에 대한 해답은 이 책에 있습니다. :") 그것이 바로 제가 말한 HOW입니다.
지금 이 순간 "이게 중요한건가?? 난 이런거 모르고도 다 개발했는데.." 라고 생각하셨다면 제가 더 이상 아무 말씀 안드리겠습니다. :") 이야기하고 싶지 않다... 라고 하는게 아닙니다. 나중에 다시 이 책을 뒤져봐야할 일이 분명히 생기기 때문입니다. :") 그럼 그 때 보셔도 됩니다.
이 번에는 패키지에 대하여 이야기 하겠습니다. 저는 이책을 읽기 전까지 패키지가 단순히 클래스의 중복을 피하기 위해서라든가 기능별로 디렉토리를 나누는 개념으로만 생각을 하였습니다. 물론 틀린 말은 아닙니다만 더 중요한 사실이 있더군요. 클래스 패스와 패키지의 관계를 아시면 "아~ 이래서 패키지가 필요한거구나~" 라고 깨달으실 수 있습니다. :")
하나의 주제에 대한 설명을 하기 위해서 어떤 상황 설정을 합니다. 그리고 그 상황에서 문제가 발생되도록 합니다. 그리고 이 문제를 해결하는 방법을 알려줍니다. 이 문제를 해결하면서 자연스럽게 클래스 패스와 패키지를 이해 시킵니다. 책을 읽는 사람의 흥미를 유발시키면서 지루하지 않게 그리고 쉽게 설명을 해주십니다. 다음 상황을 궁금하게 만들면서 집중력 또한 높아지게 만들죠.
Chapter 09. 접근제어 지시자와 정보은닉 그리고 캡슐화
책을 읽어보신 분들은 아시겠지만, 생활에서 경험해봤던 일들을 예제로 이야기하시면서 이해하기 쉽게 설명해주십니다. 과일장수와 구매자를 이용해서 정보은닉의 필요성에 대하여 설명을 해주십니다. 정보은닉이란 무엇이다!! 라고 이야기하기 보다는 정보은닉의 필요성(이해)을 먼저 설명해주는거죠.
캡슐화를 설명해주실 때도 마찬가지 입니다. 다들 아시는 "콘택600"을 예로 들면서 캡슐화에 대한 설명을 하십니다. 개인적인 생각으로는 캡슐화를 가장 정확하고 쉽게 설명해 주셨다고 생각합니다. 그 리고 예제 또한 가장 적절한 예제가 아닐까 생각합니다.
콘택 600의 기능(클래스의 기능)은 "재채기, 콧물, 코막힘"의 완화이다.
그런데 이런 콘택600이 재채기용(클래스), 콧물용(클래스), 코막힘용(클래스) 캡슐로 나뉘어져 있다면??? 우리는 재채기용, 콧물용, 코막힘용 캡슐을 따로 먹어야 겠죠.... (이하 생략)
예 제 소스를 보시면 감탄사가 나올 정도 입니다. :") 제가 이전에 알고 있던 캡슐화의 개념을 흔들어 놓더군요.....
제대로 java공부를 하지 않았던 것이죠... ㅠㅠ 이 제라도 이해를 하게 되어서 다행입니다.
Chapter 14, 15, 16 클래스의 상속
다른 Chapter들도 마찬가지이지만 클래스의 상속 또한 어떤 상황을 이야기하고 풀어나가는 과정에서 클래스의 상속에 대한 이해를 시킵니다. 그러면서 궁금해 볼만한 질문을 합니다.
"static 변수도 상속이 되나요?" "생성자도 상속이 되나요?"
개인적으로 재미난 질문이라고 생각합니다. 혹시 이글을 읽고 계신 분들 중에 위 질문에 막힘 없이 대답하실 분이 몇분 계시는지 궁금합니다. :") 저는 당연히 많으실 것이라 생각하지만, 저는 아마 이 책을 읽기 전까지는 순간 고민 좀 했을 것 같습니다. 하하;;
Chapter 23. Thread와 동기화
Thread 에 대한 사용법과 동작 원리 그리고 동기화에 대하여 설명합니다. 이런 기본적인 설명은 다른 책들에도 많이 있지만, 이 책에서는 개발자들에게 떡밥을 던져줍니다. 이 떡밥은 개발자들이 매우 좋아하는 떡밥이지요(?) ㅎㅎ
떡밥이라는 표현이 이상하지만, 그래도 누구나 한번쯤 생각해볼만한 질문이 아닌가 싶습니다. 그냥 책에서 스레드를 생성하려면 start메소드를 이용하면 된다.... 라고 하였기 때문에 우리는 그냥 start()를 사용합니다. 남들이 다 그렇게 사용하니까.. 나도 그냥..
그런데 누가 Why? 라고 물어 본다면.... ☞ ☜
원래 다 그래!! Alleh~
하실건가요??
다 뒤집으세요~
휴~ "난 정말 JAVA를 공부한 적이 없다구요"를 드디어 다 읽었습니다. 위에서 Chapter별로 몇개 정리를 했습니다. 모든 내용을 이 포스트에 담을 수 없지만, 책을 읽으면서 재미났던 부분, 감탄했던 부분내용 몇개만 설명을 드렸는데요, 오랜만에 처음부터 끝까지 읽은책이 생겼습니다. 그 만큼 지루하지 않았습니다. 그리고 많이 배웠습니다.
제 목과 다르게 이것은 JAVA를 완전 모르는 사람들만 읽어야 하는 책이라고 생각하지 않습니다. JAVA를 "제대로" 공부한 적이 없었다면, JAVA를 아직도 "제대로" 이해하지 못한 사람이라면 읽어 보면 꼭 도움이 될 것이라고 생각합니다. 아마 "난 정말 JAVA를 공부한 적이 없다구요"의 Second 개정판은 "난 정말 JAVA를 제대로 공부한 적이 없다구요"가 되지 않을까 싶습니다.
OCX[오씨엑스]란 하나의 객체 연결 및 포함(OLE) 맞춤형 컨트롤로, 마이크로소프트 윈도우에서 수행되는 응용프로 그램에서 사용되기 위해 만들어질 수 있는 특수목적 프로그램이다. OCX는 윈도우 크기 조정이나 스크롤바의 움직임 등을 처리하는 기능을 제공한다. 보통 윈도우95 이상의 운영체계를 사용하는 경우, Windows 디렉토리에 OCX라는 확장자를 가진 파일들이 많이 있다.
OLE는 문자, 그림, 소리, 동영상 등 여러가지 종류의 정보 양식을 가지고 있는 복합 문서를 지원하기 위해 설계되었다. 윈도우 데스크탑, 즉 바탕화면은 복합 문서의 대표적인 예이며, 마이크로소프트는 이를 구축하기 위해 OLE를 사용하였다. OLE와 COM(OLE를 계승하는 더욱 일반적인 개념)은 임의의 언어로 작성되어 시스템 내의 어떠한 애플리케이션에서라도 동적으로 사용될 수 있는 플러그 앤 플레이 프로그램 개발을 지원한다. 이러한 프로그램이 컴 포넌트이고, 이들이 수행되는 애플리케이션을 컨테이너라 한다. 이런 컴포넌트 기반의 애플리케이션 개발을 통해 개발 기간 단축과 프로그램 성능과 품질을 향상시킬 수 있다. 파워빌더, MS Access 같은 윈도우95와 NT 애플리케이션 개발 프로그램은 OCX의 장점을 취하고 있다.
마이크로소프트는 이제 OCX를 ActiveX control이라 부른다. OCX나 ActiveX control은 실제로 DLL 형태로 구현된다 (DLL은 수많은 애플리케이션에서 사용될 서브 프로그램으로 생각할 수 있다. 각각의 애플리케이션 프로그램은 DLL 또는 OCX/ActiveX control 객체에 대해 컨테이너가 된다). 비주얼베이직과 C++은 OCX와 ActiveX control을 만들기 위해 많이 사용된다.
OCX란 컴포넌트 라이브러리 입니다. ActiveX Control의 형태이지요. 이것이 발달한 형태가 COM이라는 것이 있습니다. 이것은 DLL또는 EXE형태로 생성이 됩니다. VB나 VC++에서 컴포넌트추가하기 작업을 보면 이런한 형태들의 라이 브러리들이 등록된 것을 볼수있습니다. 그러나 일반 DLL들은 여기에서 볼수가 없지요. 큰차이점은 여기에 있다고 봅니다. OCX나 COM은 레이스트리에 등록되어 이것을 필요로 하는 프로젝트에서 그냥 추가해서 사용할수가 있습니다. Local뿐만아니라 원격으로 사용도 가능하지요. (이것이 OCX도 되는지모름..) 그러나 일반 DLL은 자신에 시스템에 존재해야만 하고 필요할때는 프로그램내에서 위치지정도 해줘야 합니다. 그리고 Function구조로 되어 있어서 특별난 구현 없이는 DLL에서 선언된 함수만을 단순히 로딩해서 사용하는 형태이지요. OCX는 DLL처럼 단순 함수구조도 될수 있지만 강력한 컨트롤을 생성만들어 낼수도 있습니다. 이렇게 만들어낸 컴포넌트는 일반 프로그램뿐만아니라 웹에서도 같은 방식으로 불러다 사용할수 있는 장점이 있습니다. 이 밖에도 많은 호환성을 자랑합니다. OCX를 좀더 발전시킨 COM은 현재 윈도우의 지지 기반이기도 합니다. 익스플러러의 실행화일을 확인해 보시면 그용량이 상당히 작다는 것을 아실수 있을겁니다. 이유는 내부의 모듈 컴포넌트들이 COM형태로 구현되어 있고 이것을 불러다 사용하는 구조이기 때문에 익스플러러 자체는 껍데기에 불과하다고 봅니다.
JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls into the COM and Win32 libraries. The JACOB project started in 1999 and is being actively used by thousands of developers worldwide. As an open-source project, it has benefitted from the combined experience of these users, many of whom have made modifications to the code and submitted them back for inclusion in the project.
The JACOB project has moved to Sourceforge.net. Verion 1.14.3 is now available at Sourceforge.
MyComponent = new ActiveXComponent("clsid:XXXXXXXX"); MyObject = MyComponent.getObject();
//For setting and requesting properties Dispatch.put( myObject, "Property", new Variant( new Integer (1024))); //Now I want to check the set parameter Variant vResultmine = Dispatch.call( myObject, "Property"); System.out.println("Property "+vResultmine.toString());
//This line makes "IOvar" to be a read-write String variable (the OCX will be able to put data on it) Variant IOvar = new Variant(new String(""), true); //false will is used by default, in this case variables can not be written
//Next we invoke the method. In this case the method needs 2 String parameters and puts the result on a third variable (IOvariable) Variant vResult = Dispatch.call(myObject, "Method", new Variant((String)"first_parameter"), new Variant(("second_parameter")), IOvar);
//Now I print the obtained value TheIOvar=IOvar.toString(); System.out.println("TheIOvar "+TheIOvar);
public class Word{ String strDir = "c:jacob_1.9"; String strInputDoc = strDir + "file_in.doc"; String strOutputDoc = strDir + "file_out.doc"; String strOldText ="[label:import:1]"; String strNewText ="I am some horribly long sentence, so long that [insert anything]";
public Word(){ ActiveXComponent oWord = new ActiveXComponent("Word.Application"); oWord.setProperty("Visible", new Variant(isVisible)); Dispatch oDocuments = oWord.getProperty("Documnets").toDispatch(); Dispatch oDocument = Dispatch.call(oDocuments, "Open", strInputDoc).toDispatch(); Dispatch oSelection = oWord.getProperty("Selection").toDispatch();
Dispatch oFind = oWord.call(oSelection, "Find").toDispatch(); Dispatch.put(oFind, "Text", strOldText); Dispatch.call(oFind, "Execute"); Dispatch.put(oSelection, "Text", strNewText); Dispatch.call(oSelection, "MoveDown"); Dispatch.put(oSelection, "Text", "nSo we got the next line including BR.n");
public class Test extends JFrame { private static final long serialVersionUID = 1L;
public static final CLSID CLASS_ID = CLSID.create("{135CB56E-FDB4-43B6-A386-CD0C15295C07}"); Container contentPane = getContentPane(); final OleContainer oleContainer = new OleContainer();
public Test() { super("OcxPanel"); }
public void init() throws InvocationTargetException, InterruptedException {
JPanel activeXPanel = new JPanel(); oleContainer.createObject(CLASS_ID); oleContainer.setSize(600, 400); // Vadim.Ridosh Here I wrapped doOpen call to invoke it in the same OleMessageLoop with oleContainer oleContainer.getOleMessageLoop().doInvokeAndWait(new Runnable() { public void run() { doOpen(); } }); activeXPanel.add(oleContainer); contentPane.add(activeXPanel);
Variant[] variants = new Variant[]{ new Variant(m_strAppID), new Variant(m_strSiteNO), new Variant(m_strOperID), new Variant(m_strDateTime), new Variant(m_strIP), new Variant(m_strPort), new Variant(Pri), new Variant(ScanAttri), new Variant(DocID) }; try { // Vadim.Ridosh: coInitialize is not required here. Now doOpen executed in OleMessageLoop, // OleMessageLoop initialize OLE automatically // ComFunctions.coInitialize();
// Vadim.Ridosh: Object you want to call was already created in oleContainer.createObject(CLASS_ID) // So, we don't need to create it second time. Let's use already created object instead: // IUnknownImpl dispatchable = new IUnknownImpl(CLASS_ID, ClsCtx.INPROC_SERVER); //get an error Automation automation = new Automation(oleContainer.getOleObject()); automation.invoke("InitScanWnd", variants);
} catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) throws InvocationTargetException, InterruptedException { Test sample = new Test(); sample.init(); sample.setVisible(true); } }
이번에는 업무에 필요한 간단한 유틸을 만들어봤습니다. 유틸의 기능은 제가 음성 파일로 만들고 싶은 내용을 입력하면 음성 파일로 만들어 주는 것 입니다. 간단히 설명하면 "안녕하세요. 김태정입니다."라고 text를 입력하고 버튼을 누르면 어떤 wav파일이 생성되는데, 이 wav 파일을 play하면은 "안녕하세요. 김태정입니다."라는 소리가 나옵니다. (참고, 반드시 TTS 서버(Text to Speech 텍스트 음성 변환) 가 있어야 합니다.)
아래 이미지는 실행시 모습입니다. Version 1기능 - "안녕하세요. 김태정입니다." 를 입력하고 Create. Version 2기능 - "Open Excel File" 버튼을 누르고 Excel파일을 선택. 그리고 Create 버튼 클릭.
오늘 release된 버전은 second버전 입니다. release라고 하니 또 거창하네요 ㅎㅎ 저한테만 release된 것입니다. ㅎㅎ
version 1의 기능은 음성파일로 만들어 주고 싶은 text를 입력하면 이것을 wav 파일로 만들어 주는 것입니다. "Create" 버튼을 누르면 TTS서버에게 요청하면 wav 파일이 생성되는 것입니다. 결론 적으로 TTS 서버가 꼭 있어야 한다는 ^__________^
version 2의 기능은 version 1의 기능을 보완하였습니다. 수 십 또는 수 백개의 text들을 일일이 치면서 만들기 번거로우므로 Excel 파일에 wav 파일명과 text를 아래 이미지와 같이 써 넣으면 이 Excel 파일을 읽어서 wav파일들을 생성해주는 기능을 추가하였습니다.
프로그램을 실행하면 c0001.wav 파일이 생성되고 이 c0001.wav파일을 play하면은 "안녕하세요. 이것은 테스트 입니다. 123" 하고 소리가 나오게 되는거져. 이런식으로 c0018.wav까지 생성합니다.
아래는 실행시 실제적으로 생성된 파일들입니다.
그러기 위해서는 Java에서 Excel 파일을 읽는 기능을 사용해야합니다. (XLS파일을 읽는
법과 XLSX파일을 읽는 법이 다릅니다. ) 또 공부를 ㅎㅎ
참고 사이트 : 검색 사이트에서 "POI 를 이용한 Excel 문서 처리 맛보기 Quick Guide" 로 검색
필요한 jar파일 - poi-3.6-20091214.jar - ooxml-lib 하위 디렉토리에 있는 jar파일들
아래는 소스는 확장자가 .xls 인 파일을 읽는 소스입니다. MS.2007이상 버전의 Excel파일(.xlsx)은 읽지 못합니다.
private void readExcelXLS(String filePath){ FileInputStream fis = null; POIFSFileSystem fs = null; HSSFWorkbook wb = null; int sheets = 0; try { // Excel 파일 읽어 오기 fis = new FileInputStream(filePath); fs = new POIFSFileSystem(fis); wb = new HSSFWorkbook(fs); // 워크북 오브젝트의 취득 sheets = wb.getNumberOfSheets();
for(int sheetIndex=0;sheetIndex < sheets;sheetIndex++){ //워크북에서 sheetIndex번째 sheet를 가지고 옵니다. HSSFSheet sheet = wb.getSheetAt(sheetIendx); int firstRow = sheet.getFirstRowNum(); int lastRow = sheet.getLastRowNum();
// 행 별로 데이터를 취득 for(int rowIndex=firstRow ; rowIndex <= lastRow ; rowIndex++){ //sheet로부터 row를 하나씩 얻어옴 Row row = sheet.getRow(rowIndex);
//행에 데이터가 없는 경우 if(row==null){ continue; }
//저는 각 row에서 첫번째(0)와 두번째(1) cell 값만 필요해서 아래와 같이 //사용하였습니다. 각자 맞게 응용하여 사용하세요. Cell waveFile = row.getCell(0); Cell contents = row.getCell(1);
//각 cell로부터 string 값을 가지고 온다. String wave = waveFile.getRichStringCellValue().getString();; String data = contents.getRichStringCellValue().getString();
A connection abort was caused internal to your host machine. The software caused a connection abort because there is no space on the socket's queue and the socket cannot receive further connections.
WinSock description: The error can occur when the local network system aborts a connection. This would occur if WinSock aborts an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).
TCP/IP scenario: A connection will timeout if the local system doesn't receive an (ACK)nowledgement for data sent. It would also timeout if a (FIN)ish TCP packet is not ACK'd (and even if the FIN is ACK'd, it will eventually timeout if a FIN is not returned).
It seems to happen more with WindowsXP and it seems also to be possibly related to Windows firewall settings. In any case the salient point is that the abort has originated inside the local machine.
It's a stupidly worded message.
Error Message: Software caused connection abort.
Explanation:
This error can occur when the local network system aborts a connection, such as when Winsock closes an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).
User Action:
Check the following:
1. Ping the remote host you were connected to. If it doesn't respond, it might be offline or there might be a network problem along the way. If it does respond, this problem might have been a transient one (so you can reconnect now), or the server application you were connected to might have terminated (so you might not be able to connect again).
2. Ping a local host to verify that your local network is still functioning (if on a serial connection, see next step).
3. Ping your local router address. If you are on a serial connection, your local router is the IP address of the host you initially logged on to using SLIP or PPP. 4. Ping a host on the same subnet as the host you were connected to (if you know of one). This will verify that the destination network is functioning.
5. Type tracert at the command prompt to determine the path to the host you were connected to. This won't reveal too much unless you know the router addresses at the remote end, but it might help to identify if the problem is somewhere along the way.
어떤 사람들은 socket timeout시간을 늘렸더니 해결되었다는 사람들도 있습니다.
흠 저도 늘려서 해봤는데 이 문제는 아닌거 같더군요.
Software caused connection abort Error: An established connection was aborted by the software in your host machine. Software caused connection abort.
This error can occur when the local network system aborts a connection, such as when WinSock closes an established connection after data retransmission fails (receiver never acknowledges data sent on a data stream socket), possibly due to a data transmission timeout or protocol error.
You may try to set the Connection Timeout higher (Default: 60s). If the problem persists change the Data Connection Mode from "Port Mode (PORT)" to "Passive Mode (PASV)" or vice versa. For further information on how to switch between Active and Passive mode please see the following Knowledge
In modern versions of PuTTY, you should not see this error.
Windows's documentation about this error condition is not very good, but as far as we can tell, this error occurs when PuTTY is listening on a port, another program makes a connection to that port, but closes the connection so fast that PuTTY has no time to answer it.
If you are getting the error in the middle of session, it means that Windows network code killed an established connection for some reason. For example, it might happen if you pull the network cable out of the back of an Ethernet-connected computer, a DHCP IP address renewal fails or changes the computer’s IP address, or if Windows has any other similar reason to believe the entire network has become unreachable.
Windows also generates this error if it has given up on the machine at the other end of the connection ever responding to it. If the network between your client and server goes down and your client then tries to send some data, Windows will make several attempts to send the data and will then give up and kill the connection. In particular, this can occur even if you didn’t do anything, if you are using SSH-2 and WinSCP attempts a key re-exchange.
The problem can be caused also by the firewall. Try to disable it temporarily to see if the problem persists. Refer to FAQ. It can also occur if you are using keepalives in your connection. Other people have reported that keepalives fix this error for them.1) If you find DHCPNACK errors in the Event Viewer, your DHCP server may be briefly denying your IP address, causing your existing connections to fail. Where possible, this can be addressed by reserving a specific IP address on the DHCP server (e.g. cable modem/router), setting that as the static IP address, and disabling the DHCP client service.
아래 사람도 저랑 비슷한 경우인거 같습니다.
저도 첫번째 시도시는 잘 되는데... 두번째 시도할 때는 exception이 발생하더군요...
그리고 천천히 write를 하는게 아니라 좀 빨리 write를 하면은 정상적으로 동작합니다.
서버쪽에서 소켓을 닫아 버리는데, data를 받고서 어느 정도 기다렸다가 닫아버리는지 연속적으로 빠르게 data를 보내면 제대로 동작하더라고요. 결국에는 서버쪽에서 소켓을 닫아 버렸다고 생각할 수도 있는데 흠흠.. 아직 정확하지 않기 때문에 확인해보고 이야기 드리겠습니다.
Ladies, I also keep getting the same error message
but it's always after my 2nd attempt to communicate through the socket. The first attempt is fine.
Since I wrote the program for the server, I don't understand how it can be closing the connection to my client program (which I also wrote). I am not closing anything except data ports after data is transferred.
멀티스레드 환경에서 Singleton pattern을 이용할 시 문제가 될 만한 이야기를 하고 있는데요, 왜 그런 문제가 발생할 수 있는지 설명하고 있습니다. 그리고 synchronized를 이용한 해결 방법도 이야기합니다. 저는 아직 이런 것을 사용할 만한 실력(?)이 안되기 때문에 Singleton pattern 사용방법만 알아보겠습니다.
전문통신 할 때, 한글 때문에 문제가 많다 ㅠㅡ String을 byte로 변환해서 원하는 길이만큼 가져와서 String으로 만드는 방법.
소스.
String temp = "PC8000오늘두우리는달린다. "; byte[] t = temp.getBytes(); String a = new String(t, 0, 1); String b = new String(t, 1, 1); String c = new String(t, 2, 4); String d = new String(t, 6, 30); System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d);
String 생성자에 사용된 parameter 입니다.
String(byte[] bytes, int offset, int length, String charsetName)